【问题标题】:Are there cases where either an Acquire or Release barrier occurs by itself without the other matching barrier?是否存在Acquire 或Release 障碍本身发生而没有其他匹配障碍的情况?
【发布时间】:2015-01-06 05:15:14
【问题描述】:

是否需要始终配对 Acquire 和 Release 屏障?是否有任何真实情况可能在没有相应对的情况下发生(包括满足两者的完整记忆障碍)?我知道 C++11 内存模型声明此类未配对程序不是无数据竞争的,但情况总是如此吗?

例如linux kernel's documentation on memory barriers states:

ACQUIRE 操作应该几乎总是与 RELEASE 配对 操作。

为什么说“几乎总是”而不是“总是”?

【问题讨论】:

  • 这意味着您通常应该进行配对,而不是试图找到边缘情况。如果您需要边缘情况,当您尝试编写需要它的代码时,它会变得很明显。
  • @RobertHarvey:并不是说我不欣赏你的评论,而是一个特定的代码示例,其中这种边缘情况是合法的,甚至是最常见的情况,将有助于理解重申我的直觉的障碍和帮助:)

标签: c++ multithreading c++11 linux-kernel atomic


【解决方案1】:

典型的边缘情况是当您有 2ACQUIRE 匹配单个RELEASE。不是严格配对的,但这可能会简化一些代码流,否则您需要保留标志,说明 ACQUIRE 处于待处理状态。

【讨论】:

    【解决方案2】:

    如果我正确理解 dispatch_once source code 在性能方面省略读取-获取障碍。

    你可以在这个blog找到更多信息

    【讨论】:

      猜你喜欢
      • 2022-11-10
      • 2011-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-01
      • 1970-01-01
      • 2021-07-15
      相关资源
      最近更新 更多