我使用io_service
的首选方法是在应用程序启动时创建一个执行io_service
运行方法的线程。问题是,如果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));
在 某些异步任务添加到io_service
之后,线程启动。这是在chat_clients
的构造函数中完成的。
我的问题是:有没有办法在之前创建线程将某个任务添加到io_service
,i。即
// 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);
答案 0 :(得分:6)
正如你所说,它的run方法立即返回,因为它没有工作。 你需要使用 boost :: asio :: io_service :: work 。可以把它想象成一个虚拟工作项,因此 io_service :: run 永远不会用完工作,因此不会立即返回。
示例:
auto work = boost::make_shared<boost::asio::io_service::work>(m_ioservice);
m_ioservice.run();
有些人更喜欢 io_service :: run 来阻止,等待工作。其他人更喜欢Asio默认提供的行为。