3

鉴于boost::asio::ip::tcp::acceptorboost::asio::ip::tcp::socket都被标记为 Boost 1.52.0 的非线程安全,是否可以从单独的线程关闭tcp::acceptor当前阻塞?accept()

我看过调用boost::asio::io_service::stop(),这看起来可能 io_service是线程安全的。这会让io_service事件循环一直运行到套接字上的任何处理完成吗?

我正在同步操作,因为这是作为更大程序的一部分的简单事件循环,并且不想在没有充分理由的情况下创建额外的线程,我理解 async 会这样做。

4

3 回答 3

4

如果您的接受者在 中async_accept,您可以调用ip::tcp::acceptor::cancel()以取消对其进行的任何异步操作。boost::asio::error::operation_aborted请注意,这可能会使用错误代码触发此接受器中的处理程序。

如果您使用的是 synchronous accept,这似乎是不可能的,因为我认为它根本不相关io_service

于 2012-11-22T19:36:09.623 回答
4

花了一些时间研究这一点,只有一种线程安全的方式可以实现这一点:通过向套接字发送消息(在不等待的线程上accept())告诉线程关闭套接字和接受器。通过这样做,套接字和接受器可以完全由单个线程拥有。

如单独指出的,io_service仅用于异步操作。

于 2012-11-26T11:11:12.683 回答
0

我觉得你有点想多了。在条件循环中使用非阻塞接受或具有超时的本机接受。添加一个互斥锁,它是线程安全的。您还可以在新连接到达时使用本机选择和接受。为选择设置超时和条件循环。

于 2013-07-12T09:59:22.063 回答