boost::asio::io_service ioService;
boost::thread_group threadpool;
boost::barrier barrier(5);
boost::asio::io_service::work work(ioService);
threadpool.create_thread(boost::bind(&boost::asio::io_service::run, &ioService)); //Thread 1
threadpool.create_thread(boost::bind(&boost::asio::io_service::run, &ioService)); //Thread 2
threadpool.create_thread(boost::bind(&boost::asio::io_service::run, &ioService)); //Thread 3 threadpool.create_thread(boost::bind(&boost::asio::io_service::run, &ioService)); //Thread 4
while (true)
{
{
boost::lock_guard<boost::recursive_mutex> lock(mutex_);
map::iterator it = m_map.begin();
while (it != m_map.end())
{
ioService.post(boost::bind(&ProcessFun, this, it));
++it;
}
ioService.run(); <-- main thread is stuck here..
}
}
我希望能够知道分配给线程池的所有任务都已完成,只有在再次将任务分配给线程池之后。
只要线程正在处理任务,我就不想释放锁。 有什么方法可以确保所有分配的任务都完成吗?然后才继续?
最佳答案
最简单的方法是调用 ioService.run() 根据 boost asio 文档:
The io_service object's run() function will not exit while work is underway. It does exit when there is no unfinished work remaining.
顺便说一下,如果不了解更多的程序,很难确定这一点,但看来您正试图破坏 asio 的主要目的。您正在序列化批量任务。如果不知何故,在batch#2中的任何任务开始之前完全处理batch#1中的所有任务很重要,那么这可能是有意义的,但这是一种奇怪的用法。
还要小心,如果任何batch#1任务的处理程序尝试添加新任务,它们可能会在尝试获取互斥锁时发生死锁。
关于c++ - 如何仅在所有任务完成后才使用c++中的boost向线程池添加新任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29415476/