我目前正在向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();
到目前为止一直很好,但现在我希望在处理程序队列为空时触发事件而不会杀死我的活动(但正在等待)线程。
是否可能以及如何?
答案 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 ,而构建。