c++ - 如何仅在所有任务完成后才使用c++中的boost向线程池添加新任务

标签 c++ multithreading boost threadpool boost-asio

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/

相关文章:

multithreading - 基于 GPU 的视频卡可加速您的程序计算,如何?

c++ - 如何使用 Boost::Asio 访问 Web 服务?

c++ - typedef函数指针递归

C++内存访问冲突

java - Java 中使用拆分和聚合的并行作业执行

c++ - 线程间共享类的静态数据

c++ - 是否可以使用内联汇编在 visual studio 2010 c++ 中查找代码地址?

c++ - boost::join 和 boost::transformed

python - 在 Mac OS X 上使用 bjam (Boost.Build) 构建 Python 扩展

c++ - 如何将迭代器(或类似的东西)存储到硬盘上?