线程安全地关闭同步使用的boost :: asio :: ip :: tcp :: socket

时间:2012-11-22 19:09:08

标签: c++ boost boost-asio

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

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

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

3 个答案:

答案 0 :(得分:4)

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

如果你使用的是同步accept,那似乎是不可能的,因为我认为它根本与io_service无关。

答案 1 :(得分:2)

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

正如另外指出的那样,io_service仅用于异步操作。

答案 2 :(得分:0)

我认为你过分思考这一点。在条件循环中使用非阻塞接受或具有超时的本机接受。添加一个互斥锁,它的线程安全。您还可以使用本机选择并在新连接到达时接受。为select设置超时和条件循环。