如果存在std :: barrier,为什么要使用std :: latch?

时间:2018-06-27 14:41:00

标签: c++ concurrency c++20

从文档中可以很明显地看出,它们之间的区别在于std::barrier可以使用多次,而std::latch只能使用一次。

在我看来,std::latch只是std::barrier的特例,它添加了限制而不是功能。最重要的是,文档说,对count_down大于内部计数器的n的调用是未定义的行为,因此必须以编程方式强制执行此限制。

那我们为什么需要std::latch

我唯一的猜测是,可以通过提高性能的方式在硬件级别上以不同方式实现std::latch

原因是什么?

1 个答案:

答案 0 :(得分:6)

明智的使用API​​,std::latch可让您倒计时而不会阻塞。想象一下,您必须在开始其他一些任务之前渲染172个问题。您可以设置一个值为173的闩锁,并让每个完成故障的线程都向下计数该闩锁,并让应该消耗这些故障的线程在闩锁上等待。

工作线程将递减计数,但不要等待,因为它们还有其他问题要渲染。如果他们入睡,他们会使用其他一些同步原语来实现。

std::barrier仅允许您在阻止时倒计时。它不能用于允许10个线程渲染172个问题。作为障碍物,您唯一可以做的就是到达障碍物,或者确定您不再参与。

可能还存在硬件差异,但是它们的API完全不同,因此无法用屏障代替闩锁。