C++20 std::barrier与latch同步原语
请介绍C++20新增的std::barrier和std::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适合多轮迭代并行。