鉴于Boost 1.52.0中boost::asio::ip::tcp::acceptor
和boost::asio::ip::tcp::socket
都标记为非线程安全,是否可以关闭tcp::acceptor
当前阻止accept()
来自一个单独的线程?
我看过调用boost::asio::io_service::stop()
这看起来可能,因为io_service
是线程安全的。这是否会使io_service
事件循环继续运行,直到套接字上的任何处理完成为止?
我正在同步操作,因为这是一个简单的事件循环,作为一个更大的程序的一部分,并且不想在没有充分理由的情况下创建其他线程,我理解async会这样做。
答案 0 :(得分:4)
如果您的接受者位于async_accept
,您可以致电ip::tcp::acceptor::cancel()
取消对其的任何异步操作。请注意,这可能会使用boost::asio::error::operation_aborted
错误代码触发此接受器中的处理程序。
如果你使用的是同步accept
,那似乎是不可能的,因为我认为它根本与io_service
无关。
答案 1 :(得分:2)
花了一些时间研究这个,只有一种线程安全的方式可以实现这一点:通过向套接字发送消息(在不等待accept()
的线程上)告诉线程关闭插座和接受器。通过这样做,套接字和接受器可以由单个线程完全拥有。
正如另外指出的那样,io_service
仅用于异步操作。
答案 2 :(得分:0)
我认为你过分思考这一点。在条件循环中使用非阻塞接受或具有超时的本机接受。添加一个互斥锁,它的线程安全。您还可以使用本机选择并在新连接到达时接受。为select设置超时和条件循环。