概念介绍
为了进行线程间同步,C++20 引入了两个同步用的标准库工具 barrier 和 latch。
相同点:两者都能实现 n 个线程在某处同步后继续执行后续任务(例如初始化场景、等待数据到齐)。
区别:一个 barrier 对象可以重复使用(自动重置);而一个 latch 对象是一次性的,轻量级的。
我个人喜欢叫 barrier 栅栏,叫 latch 门闩 (而非锁存器)。
使用方法
构造和基本用法上,barrier 和 latch 相同。以 barrier 举例:
// 构造对象 (统一初始化风格)
barrier b{n}; // n 个线程
// 线程内使用
{
/// .....
b.arrive_and_wait(); // 在这停顿!到齐再走
/// .....
}
性能测试
在 GCC 11.4 Debug 模式(防止被优化)下进行单线程测试,发现 latch 在时间和空间情况下都更加轻量。这证明了 latch 存在的意义。
barrier | latch | |
---|---|---|
空间开销 | 32B | 4B |
arrive_and_wait 时间开销 | 150ns | 70ns |