std::latch是一次性同步原语,用于等待指定数量的操作完成,计数归零后唤醒所有等待线程且不可重用;std::barrier是可重用同步原语,支持多轮阶段性汇合,并可选抵达回调函数。

std::barrier 和 std::latch 是 C++20 引入的两个轻量级同步原语,用于协调多个线程在某个点“汇合”(synchronize),但用途和生命周期有本质区别:前者可重用、后者一次性。
std::latch:一次性的“门闩”
std::latch 用来等待一组操作全部完成。它内部维护一个计数器,初始值由构造函数指定;每次调用 count_down() 计数器减一;当计数器归零,所有阻塞在 wait() 的线程被唤醒——且之后无法重置或复用。
典型场景:主线程启动多个工作线程,等它们全部初始化完毕再统一开始执行。
- 构造时传入期望的线程数(如
std::latch ready(4)表示等 4 次count_down) - 各线程完成准备后调用
ready.count_down() - 主线程调用
ready.wait()阻塞,直到计数为 0 - 不能重复使用,也不能增加计数;用完即弃
std::barrier:可重复使用的“路障”
std::barrier 也基于计数,但它支持“阶段式同步”——所有线程到达后一起通过,然后自动重置计数器,进入下一轮等待。适合循环协作场景,比如多线程迭代计算。
立即学习“C++免费学习笔记(深入)”;
它还支持可选的“抵达后回调”(arrival phase function),在最后一名线程抵达、所有线程释放前执行一次(常用于汇总、交换数据等)。
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。
还木有评论哦,快来抢沙发吧~