首页 > 解决方案 > boost::asio::io_service 在线程中,在应用程序退出时不退出

问题描述

我有一个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用来跳出循环,我认为这是因为它一直在等待一个永远不会连接的客户端。

在接受者等待时,如何正确终止该线程?

标签: c++boostboost-asio

解决方案


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

如果您使用常规方法,您可能会处理信号:

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


推荐阅读