让io_service保持活力

Ver*_*tex 3 boost boost-asio

我首选的方法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)

Rui*_*Fig 7

如你所说,它的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默认提供的行为.

  • 另外,为了停止应用程序,我在`t.join();`之前使用`work.reset();` (3认同)