从文档中可以很明显地看出,它们之间的区别在于std::barrier
可以使用多次,而std::latch
只能使用一次。
在我看来,std::latch
只是std::barrier
的特例,它添加了限制而不是功能。最重要的是,文档说,对count_down
大于内部计数器的n
的调用是未定义的行为,因此必须以编程方式强制执行此限制。
那我们为什么需要std::latch
?
我唯一的猜测是,可以通过提高性能的方式在硬件级别上以不同方式实现std::latch
。
原因是什么?
答案 0 :(得分:6)
明智的使用API,std::latch
可让您倒计时而不会阻塞。想象一下,您必须在开始其他一些任务之前渲染172个问题。您可以设置一个值为173的闩锁,并让每个完成故障的线程都向下计数该闩锁,并让应该消耗这些故障的线程在闩锁上等待。
工作线程将递减计数,但不要等待,因为它们还有其他问题要渲染。如果他们入睡,他们会使用其他一些同步原语来实现。
std::barrier
仅允许您在阻止时倒计时。它不能用于允许10个线程渲染172个问题。作为障碍物,您唯一可以做的就是到达障碍物,或者确定您不再参与。
可能还存在硬件差异,但是它们的API完全不同,因此无法用屏障代替闩锁。