锁存器(latch)是一种线程协调机制,允许一个或多个线程阻塞,直到某个操作完成。 单个 latch 是一次性对象,一旦操作完成,就无法重复使用。
void DoWork(threadpool* pool) {
boost::latch completion_latch(NTASKS);
for (int i = 0; i < NTASKS; ++i) {
pool->add_task([&] {
...
// countdown--
completion_latch.count_down();
}));
}
// block until countdown to zero
completion_latch.wait();
}
栅栏(barrier)是一种线程协调机制,允许多个线程阻塞,直到操作完成。 与 latch 不同,barrier 可重复使用,一旦操作完成,线程可以重复使用相同的 barrier。 因此它对于管理由多个线程处理的重复任务很有用。
void DoWork(threadpool* pool) {
boost::barrier barr(NTASKS);
for (int i = 0; i < NTASKS; ++i) {
pool->add_task([&] {
...
// block until all work get to here
barr.wait();
}));
}
// block until countdown to zero
}
这两种同步方式的选择,就看你是想要阻塞所有线程等待操作(latch),还是阻塞在主线程的一个点而子线程可以灵活执行(barrier)。