c++ - 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
用来跳出循环,我认为这是因为它一直在等待一个永远不会连接的客户端。
在接受者等待时,如何正确终止该线程?
解决方案
您如何“在客户端连接之前尝试关闭应用程序”?
如果您使用常规方法,您可能会处理信号:
除此之外,原则上没有办法取消同步接受,但是您可以通过连接到自己的侦听端来伪造它,从而accept
返回。
推荐阅读
- python - 创建嵌套字典以遍历我的文本文件和文件夹以创建多个键字典
- c# - 将列表拆分为块 - C#
- java - 围绕其中心旋转 GLUT 位图/笔画字符串?
- r - 我是否通过标准化我的数据搞砸了我的整个数据科学作业?
- embedded - 嵌入式系统中的跨平台开发意味着什么?
- r - 类似于转置的融化呼叫
- wpf - 如何将用户控件上的按钮绑定到父控件中的命令?
- google-sheets-formula - 如何跨列拖动公式,仅自动更改单元格引用?
- javascript - 有没有办法在 React Material 上触发 onPaste 事件
在 Internet Explorer 中? - jgroups - JGroups FD_SOCK 配置问题