我首选的方法io_service是在应用程序启动时创建一个执行io_servicerun方法的线程.问题是,如果没有任务io_service,其run方法立即返回并且线程终止.
正如您在chat_client.cpp中看到的那样
...
boost::asio::io_service io_service;
...
chat_client c(io_service, iterator);
boost::thread t(boost::bind(&boost::asio::io_service::run, &io_service));
Run Code Online (Sandbox Code Playgroud)
添加一些异步任务后启动该线程io_service.这是在chat_clients构造函数中完成的.
我的问题是:有没有办法在添加某个任务之前创建线程io_service,即
// create io_service and thread on application start
boost::asio::io_service io_service;
boost::thread t(boost::bind(&boost::asio::io_service::run, &io_service));
// add some task to io_service
chat_client c(io_service, iterator);
Run Code Online (Sandbox Code Playgroud)
如你所说,它的run方法立即返回,因为它没有工作.你需要使用boost :: asio :: io_service :: work.可以把它想象成一个虚拟工作项,因此io_service :: run永远不会失去工作,因此不会立即返回.
例:
auto work = boost::make_shared<boost::asio::io_service::work>(m_ioservice);
m_ioservice.run();
Run Code Online (Sandbox Code Playgroud)
有些人更喜欢io_service :: run来阻止,等待工作.其他人更喜欢Asio默认提供的行为.