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

std::barrier 和 std::latch 是 C++20 引入的两个轻量级同步原语,用于协调多个线程在某个点“汇合”(synchronize),但用途和生命周期有本质区别:前者可重用、后者一次性。
std::latch 用来等待一组操作全部完成。它内部维护一个计数器,初始值由构造函数指定;每次调用 count_down() 计数器减一;当计数器归零,所有阻塞在 wait() 的线程被唤醒——且之后无法重置或复用。
典型场景:主线程启动多个工作线程,等它们全部初始化完毕再统一开始执行。
std::latch ready(4) 表示等 4 次 count_down)ready.count_down()
ready.wait() 阻塞,直到计数为 0std::barrier 也基于计数,但它支持“阶段式同步”——所有线程到达后一起通过,然后自动重置计数器,进入下一轮等待。适合循环协作场景,比如多线程迭代计算。
立即学习“C++免费学习笔记(深入)”;
它还支持可选的“抵达后回调”(arrival phase function),在最后一名线程抵达、所有线程释放前执行一次(常用于汇总、交换数据等)。
std::barrier sync(4)
sync.arrive_and_wait() —— 先抵达,再阻塞,等全员到齐才返回std::barrier sync(4, []{ /* 每轮同步前执行一次 */ });
二者名字相似,但设计目标不同:
它们头文件都是 <barrier></barrier>,注意编译器需支持 C++20(如 GCC 10+、Clang 11+、MSVC 19.28+),并开启 -std=c++20。
不推荐用它们替代 mutex 或 condition_variable 做细粒度互斥;它们解决的是“集体行动步调一致”的问题,不是“保护共享数据”。用错场景反而引入竞态或死锁。
基本上就这些。不复杂但容易忽略细节——记清“一次”还是“多次”,就能选对工具。
以上就是C++的std::barrier和std::latch怎么用?C++20线程同步原语【并发编程】的详细内容,更多请关注php中文网其它相关文章!
编程怎么学习?编程怎么入门?编程在哪学?编程怎么学才快?不用担心,这里为大家提供了编程速学教程(入门课程),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号