我有我的C++程序。主线程创建一个仅用于处理websocket的新线程。例如,这个新线程使用boost beast的async_read()调用进行读写。这很像https://www.boost.org/doc/libs/1_69_0/libs/beast/example/websocket/server/async/websocket_server_async.cpp,其中每个异步调用都会引起另一个异步调用。
但是,让主线程告诉websocket线程关闭的惯用方法是什么,因为可能总是有一些未完成的异步读或写调用,比如等待服务器最终发送数据的async_read()空闲调用。关机需要做一些事情,比如取消剩余的async_read(),而不引入某种竞争条件,即在取消之前开始读取。
发布于 2019-01-10 08:13:41
使用boost::asio::post将lambda发布到io_context (如有必要,使用适当的strand ),该a在底层basic_socket上调用cancel。挂起的操作将使用boost::asio::error::operation_aborted立即完成。在完成处理程序中,您可以检查basic_socket::is_open以了解是否应该尝试新的异步调用。
https://stackoverflow.com/questions/54106530
复制相似问题