如何在停止io_service之前等待所有挂起的完成处理程序被执行
How to wait for all pending completion handlers to be executed before stopping io_service?
我正在使用boost::asio编写服务器。我有多个线程,每个线程都拥有自己的io_service
对象。我使用io_service::work
对象保持io_service
运行时,没有完成处理程序执行。在某些时刻,我调用io_service
对象的stop
方法来完成调用io_serice::run
的线程。但在某些情况下,当我调用stop
时,我已经在io_service
中发布了未完成的对象竞争处理程序。调用stop
会阻止发布的竞争处理程序执行,但这对我来说是不可接受的,因为我需要在停止线程之前完成所有悬而未决的工作。如何在调用io_service
的stop
方法之前等待所有挂起的完成处理程序首先被执行?
重置work
。
当所有挂起的工作完成后,任何io_service::run()
都将返回。
常见的模式是使用optional<work>
,这样您就可以清除它。如果它是一个频繁的事情,您可以通过将它包装在一个支持raii的类中来减少一些心理开销:
Live On Coliru
#include <boost/asio.hpp>
#include <boost/optional.hpp>
struct work {
using io_service = boost::asio::io_service;
work(io_service& svc) : _work(io_service::work(svc))
{ }
void release() {
_work.reset();
}
void enlist(io_service& svc) {
_work.emplace(io_service::work(svc));
}
private:
boost::optional<io_service::work> _work;
};
#include <thread>
#include <iostream>
using namespace std::chrono_literals;
int main() {
boost::asio::io_service svc;
work lock(svc);
std::thread background([&] { svc.run(); });
std::this_thread::sleep_for(1s);
std::cout << "releasing work";
lock.release();
background.join();
}
1秒后结束后台线程
相关文章:
- 挂起和取消挂起一个文件DLL
- 如何防止C++遗留代码中的挂起指针
- 为什么所有C++编译器都会崩溃或挂起此代码
- 我编写了代码将十进制分数转换为其二进制等效数.它编译得很好,但在执行时挂起
- 构建挂起,即使是适度的文件大小
- 循环挂起迭代的 std::擦除 on std::list
- Poco::Net::FTPClientSession 在 open() 方法上挂起 129 秒,如果 ftp 主机不存
- Node.js fs.open() 在尝试打开 4 个以上的命名管道 (FIFO) 后挂起
- 从不同进程中的另一个线程挂起/恢复线程或进程
- Boost (Beast) websocket:同步写入挂起
- 为什么析构函数挂起
- 使用互斥会挂起程序
- 在C++和 Python 程序中使用命名管道的 IPC 挂起
- 设置变量时C++程序挂起
- cudaMemcpyToSymbol只是挂起,永远不会返回.GPU 处理速度为 100%.代码在 K40 上工作正常,但
- 处理程序在处理 SIGWINCH 后挂起
- 如何正确处理C++线程中永久挂起的第三方库调用
- 如何在停止io_service之前等待所有挂起的完成处理程序被执行
- 如何在Visual c#或c++中正确处理Windows 10应用程序的挂起?
- Recvfrom()挂起——当服务器关闭时如何处理这个问题