让io_service保持活力

时间:2016-03-11 16:41:01

标签: boost boost-asio

我使用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);

1 个答案:

答案 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默认提供的行为。