boost asio的work作用

要想实现异步操作,就需要提供一个环境,这个环境是

boost::asio::io_service io_service_;

io_service_.run();

但是io_service_.run(),是不阻塞的,这个环境是需要io_service_.run()阻塞运行的,于是需要改成这样

boost::asio::io_service io_service_;

boost::asio::io_service::work work_(io_service_);

io_service_.run();

用io_service构造出一个work之后,再执行io_service_.run();就是阻塞的了。但是主线程不可以阻塞,否则后面的代码没法执行了,于是需要继续改

boost::asio::io_service io_service_;

boost::asio::io_service::work work_(io_service_);

boost::thread th(run_io);

void run_io()
{
    io_service_.run();
}

work: 可以防止io_service里注册的所有事件完成时退出事件循环。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
boost asio是一个强大的C++库,可以用于网络编程和异步操作。在boost asio中,使用run函数来运行异步操作的事件循环。 在boost asio中,run函数会执行事件循环,直到所有的异步操作都完成或者被中断。在运行事件循环时,boost asio会自动创建一个或多个工作线程来处理异步操作。 boost asio的run函数默认会根据系统的核心数自动创建相应数量的工作线程。这个默认行为通常是比较合理的,可以充分利用系统的多核性能。 如果想要手动设置运行线程的数量,可以使用io_context对象的work_guard方法。work_guard保持事件循环一直运行,直至显式停止。通过设置work_guard的数量,就可以控制运行线程的数量。 使用work_guard的示例代码如下: ```cpp #include <boost/asio/io_context.hpp> #include <boost/asio/executor_work_guard.hpp> #include <iostream> int main() { boost::asio::io_context io_context; boost::asio::executor_work_guard<boost::asio::io_context::executor_type> work_guard = boost::asio::make_work_guard(io_context); // 设置运行线程的数量为4 std::size_t num_threads = 4; std::vector<std::thread> threads; for (std::size_t i = 0; i < num_threads; ++i) { threads.emplace_back([&io_context]() { io_context.run(); }); } // 等待所有线程执行完毕 for (auto& thread : threads) { thread.join(); } return 0; } ``` 在这个示例中,我们手动设置了运行线程的数量为4。通过设置work_guard的数量,保证了事件循环的持续运行,直到显式停止。在实际使用中,可以根据需要灵活调整运行线程的数量,以满足性能和资源的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值