Beast Websocket惯用关机?

时间:2019-01-09 09:09:09

标签: c++ boost-beast

我有我的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(),而不会引入某种竞争条件,即在取消之前读取就开始发生。

1 个答案:

答案 0 :(得分:0)

使用boost::asio::post将lambda发布到io_context(必要时使用适当的strand),该lambda调用基础cancel上的basic_socket。待处理操作将立即通过boost::asio::error::operation_aborted完成。在完成处理程序中,您可以检查basic_socket::is_open以确定是否应该尝试新的异步调用。