Boost Asio - 如何知道处理程序队列何时为空?

时间:2012-11-22 17:07:14

标签: c++ multithreading boost boost-asio

我目前正在向io_service发布处理程序并在线程池中执行它们。

io_serv.post( boost::bind(&Class::bar, p1, p2) );

我的工作人员运行此功能:

m_mutex.lock();
std::cout << "[" << boost::this_thread::get_id()
        << "] Thread Start" << std::endl;
m_mutex.unlock();

size_t tasks = m_serv.run();

m_mutex.lock();
std::cout << "[" << boost::this_thread::get_id() << "] accomplished "
          << tasks << " tasks" << std::endl;
m_mutex.unlock();

到目前为止一直很好,但现在我希望在处理程序队列为空时触发事件而不会杀死我的活动(但正在等待)线程。

是否可能以及如何?

1 个答案:

答案 0 :(得分:2)

我第一次看到使用 asio 作为队列调度程序。我认为技术不错。

好吧,我建议您运行 io_service :: run 来为处理程序提供服务。正如documentation所述,运行将阻止,直到io_service停止或所有工作都已完成。所以你可以在 io_service :: run 之后运行你的“空队列事件”:

while( !finished ) {
    io_serv.run();
    io_serv.reset();
    io_serv.post( boost::bind(&Class::fill_queue, instance) );
}

如果您在此io_service上没有其他asio活动而您没有使用io_service :: work。

正如评论中提到的那样,您使用 io_service :: work ,因此计划A失败(由于此类阻止在空队列中退出,因此无效)。好吧,你可以在每一堆io_serv.post() - s之后为线程作业做io_serv.post()。处理程序可以包含等待 boost :: condition ,而其他线程完成其工作。正如您在实际工作后对此post()所做的那样,我认为asio会在派遣所有工作后调用它,但其主题是调查。无论如何,如果条件尚未准备好,处理程序可以重新post()自己释放当前线程。

但我认为最简单的方法是将 io_service :: work 替换为equialent ,而构建。