boost::asio::io_service 在线程中,不会在应用程序退出时退出

boost::asio::io_service in thread, does not exit on application exit

本文关键字:退出 应用程序 线程 io asio service boost      更新时间:2023-10-16

我有一个使用boost::asio::io_service来侦听客户端连接的应用程序。我正在线程中运行它,循环如下:

static auto const flags = boost::archive::no_header | boost::archive::no_tracking;
while (!_exit)
{
boost::asio::io_service ios;
boost::asio::ip::tcp::endpoint endpoint
= boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), 4444);
acceptor = new boost::asio::ip::tcp::acceptor(ios, endpoint);
boost::asio::ip::tcp::iostream stream;
// program stops here until client connects.
acceptor->accept(*stream->rdbuf());

//grab the incoming data using 
boost::archive::binary_oarchive archive(*stream);
archive << data;
}

如果客户端连接,数据就会进来,一切都很好。如果我尝试在客户端连接之前关闭应用程序,线程不会死亡。 我无法使用_exit = true来打破循环,我认为这是因为它被困在等待永远不会连接的客户端。

如何在接受器等待时正确终止此线程?

如何"尝试在客户端连接之前关闭应用程序"?

如果您使用的是常规方法,则可以处理信号:

  • https://www.boost.org/doc/libs/1_68_0/doc/html/boost_asio/reference/signal_set.html

除此之外,原则上没有办法取消同步接受,但您可以通过连接到自己的侦听端来伪造它,从而使accept返回。