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)
。但是,如果这样做,线程将被销毁,下次必须再次创建它们,这会破坏线程池的意义。
使用该库的人可以向我展示如何同步线程吗?
答案 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