我有一个使用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
来打破循环,我认为这是因为它一直在等待从未连接的客户端。
在接受者等待期间,如何正确杀死该线程?
答案 0 :(得分:1)
您如何“尝试在客户端连接之前关闭应用程序”?
如果您使用常规方法,则可能会处理信号:
除此之外,原则上没有办法取消同步接受,但是您可以通过连接到自己的监听端来伪造它,从而使accept
返回。