我有我的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(),而不会引入某种竞争条件,即在取消之前读取就开始发生。
答案 0 :(得分:0)
使用boost::asio::post
将lambda发布到io_context
(必要时使用适当的strand
),该lambda调用基础cancel
上的basic_socket
。待处理操作将立即通过boost::asio::error::operation_aborted
完成。在完成处理程序中,您可以检查basic_socket::is_open
以确定是否应该尝试新的异步调用。