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

有一个使用boost :: asio的例子。

  1. 为什么这个例子使用boost :: asio :: io_service :: work?
  2. 为什么是srv.run (); 没有调用在线程中执行任务?
 int main() { boost::asio::io_service srv; boost::asio::io_service::work work(srv); boost::thread_group thr_grp; thr_grp.create_thread(boost::bind(&boost::asio::io_service::run, &srv)); thr_grp.create_thread(boost::bind(&boost::asio::io_service::run, &srv)); srv.post(boost::bind(f1, 123)); srv.post(boost::bind(f1, 321)); //sync srv.post(boost::bind(f2, 456)); srv.post(boost::bind(f2, 654)); //sync srv.stop(); thr_grp.join(); } 

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

 int main() { boost::asio::io_service srv; //boost::asio::io_service::work work(srv); std::vector<boost::thread> thr_grp; srv.post(boost::bind(f1, 123)); srv.post(boost::bind(f1, 321)); //sync srv.post(boost::bind(f2, 456)); srv.post(boost::bind(f2, 654)); //sync // What is the difference between the poll and run, when io_service without work? thr_grp.emplace_back(boost::bind(&boost::asio::io_service::poll, &srv));// poll or run? thr_grp.emplace_back(boost::bind(&boost::asio::io_service::run, &srv));// poll or run? srv.stop(); for(auto &i : thr_grp) i.join(); int b; std::cin >> b; return 0; } 

当没有工作对象调用io_service :: run方法时,它将立即返回。 通常,这不是大多数开发人员正在寻找的行为。 当然有一些例外,但大多数开发人员正在寻找指定一个线程来处理所有的asynchronous处理,并不希望该线程退出,直到被告知这样做。 这就是你的代码示例。

io_service :: run方法被指定为create_thread方法中的委托或函数指针。 所以,当从create_thread方法创build线程时,它将调用io_service :: run方法,并将io_service对象作为parameter passing。 通常,一个io_service对象可以与多个套接字对象一起使用。

通常在closures应用程序或者不再需要所有客户机/服务器之间的通信时调用停止方法,并且预计不需要启动任何新的连接。