有一些similar questions就这样。但他们只以一种方式提出问题。
std::latch
与 std::barrier
相比,它有一个优势,与后者不同,前者可以被参与线程多次递减。
std::barrier
与 std::latch
相比,与后者不同的是,前者一旦到达的线程在某个阶段的同步点解除阻塞就可以重用。
但我的问题是,为什么首先有两个几乎相同的东西?为什么他们决定不将两者合而为一,例如 Java Phaser
?
Phaser
是在 Java7 中引入的,作为比 Java5 中引入的 CountDownLatch
和 CyclicBarrier
更灵活的选项。它具有与前两个类几乎相同的 API。 (这里我以Java为例只是为了说明将它们结合起来确实是可能的。)
他们决定单独提供闩锁和屏障,而不是提供单个移相器类,那么单独提供它们一定会带来一些好处,主要是一些与性能相关的问题。那么,这个问题到底是什么?
最佳答案
C++ 有一个原则,即不为不使用的东西付费。如果在同一个线程中不使用两次 std::barrier 的情况下,如果 std::barrier
的实现效率比 std::latch
更高效 - 那么就有理由这样做提供更有效的习惯用法和更通用的习惯用法。
至于“问题到底是什么”:C++ 没有可以均衡所有系统的虚拟机。而且,STL 没有指定类的具体实现。因此,闩锁/屏障的实现取决于系统、供应商或开发人员的品味。
关于c++ - 为什么 C++ 引入了单独的 std::latch 和 std::barrier?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72947708/