10、boost asio 教程---阻止 `io_context::run` 返回

本文介绍了如何使用`boost::asio::executor_work_guard`保持`io_context::run`持续运行,即使没有待执行任务。当需要停止应用程序时,可以使用`io_context::stop`函数,该函数将在适当的时候停止io_context并丢弃剩余任务。如果希望等待所有任务完成再退出,可以销毁`executor_work_guard`实例,这是一个线程安全的操作。

`io_context::run` 运行直到所有计划的任务都完成。然后,`io_context::run` 将返回,并且调用线程将解除阻塞:

boost::asio::io_context io_context;
// 安排一些任务
io_context.run();
std::cout << "任务完成!继续执行\n";

然而,有时您可能需要无论是否有要执行的任务都保持它运行。到目前为止,我们已经审查过的服务器始终在执行 `async_accept`,因此它们始终至少有一个已计划的任务,所以我们实际上不需要以这种方式保持它们运行。但是客户端不执行 `async_accept`,这对于它在某个时候没有计划的任务是正常的。要防止 `io_context::run` 返回,您应该使用 `boost::asio::executor_work_guard`(以前的 `io_context::work`,目前已弃用)类实例。它的名称太长了,因此让我们立即给它起一个别名:

using work_guard_type = boost::asio::executor_work_guard<boost::asio::io_context::executor_type>;

boost::asio::io_context io_context;
work_guard_type work_guard(io_context.get_executor());
// 安排一些任务或不安排
io_context.run();
std::cout << "对不起,我们永远不会到达这里!
### Boost.Asio `io_context::work` 使用方法及作用 #### 1. 防止 `io_context` 提前退出 为了确保 `io_context` 不会在没有任何待处理的操作时提前返回,可以使用 `boost::asio::io_context::work` 类。这个类的作用是在没有其他等待处理的工作项时保持 `io_context` 处于忙碌状态[^1]。 ```cpp #include <boost/asio.hpp> #include <iostream> int main() { boost::asio::io_context io; // 创建一个 work 对象来阻止 io_context 提前结束 auto work = std::make_shared<boost::asio::io_context::work>(io); // 启动线程池并让它们运行 io_context std::vector<std::thread> threads; for (std::size_t i = 0; i < 5; ++i) threads.emplace_back([&io]() { io.run(); }); // 执行一些异步操作... // 当所有工作完成之后销毁 work 对象以允许 io_context 结束 work.reset(); // 等待所有线程完成 for (auto& t : threads) t.join(); return 0; } ``` 这段代码展示了如何创建一个 `work` 实例来防止 `io_context` 在没有活动连接的情况下停止运行。当不再需要继续运行事件循环时,可以通过释放 `work` 来通知 `io_context` 可以安全地终止其执行。 #### 2. 维持事件循环活跃 除了上述提到的功能外,`io_context::work` 还有助于维持整个应用程序生命周期内的持续性事件轮询。即使当前不存在任何实际的任务或 I/O 请求正在被处理,只要存在有效的 `work` 对象实例,`run()` 方法就不会轻易返回给调用者[^2]。 这使得开发者能够在多线程环境中更灵活地控制任务分配以及资源管理策略,而不用担心由于缺乏未决事务而导致意外的行为变化或者性能瓶颈问题的发生[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Knowledgebase

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值