c++ 为什么我们需要使用boost::asio::io_service::work?

jecbmhm3  于 2023-06-25  发布在  其他
关注(0)|答案(2)|浏览(163)

这里有一个使用boost::asio的例子。
1.为什么这个例子使用boost::asio::io_service::work?
1.为什么不调用srv.run ();来执行线程中的任务?

  1. int main()
  2. {
  3. boost::asio::io_service srv;
  4. boost::asio::io_service::work work(srv);
  5. boost::thread_group thr_grp;
  6. thr_grp.create_thread(boost::bind(&boost::asio::io_service::run, &srv));
  7. thr_grp.create_thread(boost::bind(&boost::asio::io_service::run, &srv));
  8. srv.post(boost::bind(f1, 123));
  9. srv.post(boost::bind(f1, 321));
  10. //sync
  11. srv.post(boost::bind(f2, 456));
  12. srv.post(boost::bind(f2, 654));
  13. //sync
  14. srv.stop();
  15. thr_grp.join();
  16. }

**更新:**使用io_service而不使用io_service::work时,轮询和运行有什么区别?

  1. int main()
  2. {
  3. boost::asio::io_service srv;
  4. //boost::asio::io_service::work work(srv);
  5. std::vector<boost::thread> thr_grp;
  6. srv.post(boost::bind(f1, 123));
  7. srv.post(boost::bind(f1, 321));
  8. //sync
  9. srv.post(boost::bind(f2, 456));
  10. srv.post(boost::bind(f2, 654));
  11. //sync
  12. // What is the difference between the poll and run, when io_service without work?
  13. thr_grp.emplace_back(boost::bind(&boost::asio::io_service::poll, &srv));// poll or run?
  14. thr_grp.emplace_back(boost::bind(&boost::asio::io_service::run, &srv));// poll or run?
  15. srv.stop();
  16. for(auto &i : thr_grp) i.join();
  17. int b;
  18. std::cin >> b;
  19. return 0;
  20. }
r9f1avp5

r9f1avp51#

io_service::run方法在没有工作对象的情况下被调用时,它将立即返回。通常,这不是大多数开发人员正在寻找的行为。当然也有一些例外,但大多数开发人员都希望指定一个线程来处理所有的异步处理,并且不希望该线程在被告知退出之前退出。这就是你的代码示例所做的。
io_service::run方法被指定为create_thread方法中的委托或函数指针。因此,当线程从create_thread方法创建时,它将调用io_service::run方法,并传递io_service对象作为参数。通常,一个io_service对象可以与多个套接字对象一起使用。
stop方法通常在关闭应用程序或不再需要所有客户端/服务器之间的通信时调用,并且预计不需要启动任何新的连接。

n3ipq98p

n3ipq98p2#

work用于通知io_context工作何时开始和完成。Boost文档说,那是弃用的。

相关问题