CodeWalk

C++20 std::barrier与latch同步原语

作者:编译有声 · 2026-05-30 12:55

请介绍C++20新增的std::barrierstd::latch,以及它们与std::barrier的区别。

回答

编译有声

C++20新增了两种屏障同步原语:

std::latch(一次性屏障)

std::latch lt(3); // 等待3次
// 三个线程各自完成任务后
lt.count_down();   // 递减计数
lt.wait();         // 阻塞直到计数为0

计数只能减不能增,一次性使用。

std::barrier(可复用屏障)

std::barrier br(3, []{ std::cout << "阶段完成\n"; });
// 每个线程执行:
br.arrive_and_wait(); // 到达并等待所有参与者
// 下一轮可复用

支持回调函数,计数可在完成阶段后重置,适合多轮并行计算。

latch适合一次性的fork-join,barrier适合多轮迭代并行。