c++ - 为什么 C++ 引入了单独的 std::latch 和 std::barrier?

标签 c++ synchronization barrier countdownlatch phaser

有一些similar questions就这样。但他们只以一种方式提出问题。

std::latchstd::barrier 相比,它有一个优势,与后者不同,前者可以被参与线程多次递减

std::barrierstd::latch 相比,与后者不同的是,前者一旦到达的线程在某个阶段的同步点解除阻塞就可以重用

但我的问题是,为什么首先有两个几乎相同的东西?为什么他们决定不将两者合而为一,例如 Java Phaser

Phaser 是在 Java7 中引入的,作为比 Java5 中引入的 CountDownLatchCyclicBarrier 更灵活的选项。它具有与前两个类几乎相同的 API。 (这里我以Java为例只是为了说明将它们结合起来确实是可能的。)

他们决定单独提供闩锁和屏障,而不是提供单个移相器类,那么单独提供它们一定会带来一些好处,主要是一些与性能相关的问题。那么,这个问题到底是什么?

最佳答案

C++ 有一个原则,即不为不使用的东西付费。如果在同一个线程中不使用两次 std::barrier 的情况下,如果 std::barrier 的实现效率比 std::latch 更高效 - 那么就有理由这样做提供更有效的习惯用法和更通用的习惯用法。

至于“问题到底是什么”:C++ 没有可以均衡所有系统的虚拟机。而且,STL 没有指定类的具体实现。因此,闩锁/屏障的实现取决于系统、供应商或开发人员的品味。

关于c++ - 为什么 C++ 引入了单独的 std::latch 和 std::barrier?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72947708/

相关文章:

c++ - 为什么 if constexpr 需要 else 才能工作?

Java同步静态列表?

java - CyclicBarrier:导致屏障跳闸的 'x' 个线程中的 'y' 完成执行并终止

c++ - 如何在 MSVC 中的原始字符串文字中使用 Unicode 符号/表情符号

c++ - SendMessage() WINAPI 在用于连接到 DDE 服务器时挂起

java - 在 Java 中同时运行两个类

java - 同步嵌套映射和集 (Java)

javascript - 如何使用 `async` 实现屏障?

ios - 如何在swift 3中做障碍

C# 解释器。用于 C++ 中的事件形状模型库