CTPL线程池库如何等待所有线程完成?

时间:2020-08-01 05:58:46

标签: c++ multithreading threadpool

void runner(int id, int a, int b) {...}

void caller()
{
  static ctpl::thread_pool pool(4);
  for (int i = 0; i < nbThreads; i++) {
    pool.push(runner, a, b);
  }
  pool.stop(true); // this kills all threads, meaning next time this function is called i have to create them again
}

所以我在这里使用这个库:https://github.com/vit-vit/ctpl

但是,在示例中,我没有看到任何用于同步线程的函数。对于std::thread,它将是th.join()pool.get_thread(i).join()不是解决方案;它冻结,因为线程一直在运行,总是在运行以接受新命令,这是它的预期行为。

我认为工作的唯一途径是pool.stop(true)。但是,如果这样做,线程将被销毁,下次必须再次创建它们,这会破坏线程池的意义。

使用该库的人可以向我展示如何同步线程吗?

1 个答案:

答案 0 :(得分:0)

使用std::future获取每个线程的结果。然后在wait()个对象上使用std::future

std::future<void> results[nbThreads];
for (int i=0; i<nbThreads; i++) results[i] = pool.push(runner, a, b);
for (int i=0; i<nbThreads; i++) results[i].wait(); // synchronize all threads