鉴于自Boost 1.52.0以来,`boost::asio::ip::tcp::acceptor`和`boost::asio::ip::tcp::socket`都被标记为非线程安全,是否可能从单独的线程关闭当前在`accept()`上阻塞的`tcp::acceptor`?
我尝试调用`boost::asio::io_service::stop()`,这似乎是可行的,因为`io_service`是线程安全的。但这会使`io_service`事件循环保持运行状态,直到对套接字正在进行的任何处理完成为止?
由于这只是一个更大程序中简单的事件循环,我正在同步操作,不想没有充分理由就创建额外的线程,而我知道异步操作会这样做。
我尝试调用`boost::asio::io_service::stop()`,这似乎是可行的,因为`io_service`是线程安全的。但这会使`io_service`事件循环保持运行状态,直到对套接字正在进行的任何处理完成为止?
由于这只是一个更大程序中简单的事件循环,我正在同步操作,不想没有充分理由就创建额外的线程,而我知道异步操作会这样做。
stop()
?ASIO 的整个设计理念是应用程序是单线程的。理想情况下,您的事件触发器(回调)之一会调用stop()
。 - chrisaycockio_service
调度处理程序,停止它并不能帮助你。另一方面,从另一个线程关闭接收器将不是线程安全的。唯一安全的方法是使用async_accept
,然后在同一个线程中关闭接收器,如果需要的话。 - Igor R.io_service::run()
,并且处理程序将分派到所有这些线程,因此您可以轻松地获得异步多线程。此外,asio 还有许多简化多线程编程的功能,例如 asio::strand 等。 - Galimov Albert