【问题标题】:c++ memory order (sequential consistent) [closed]c ++内存顺序(顺序一致)[关闭]
【发布时间】:2021-11-02 15:45:09
【问题描述】:

我正在阅读有关原子和内存命令的信息,我真的很困惑。

  1. 首先我想知道我们是否使用顺序一致作为我们的原子操作的内存顺序,之前和之后的任何语句都不能重新排序并且它们被执行 完全按照源代码顺序?
  2. 当我们说所有线程看到相同的操作顺序并且存在全局总顺序时,这是什么意思? (如果能举例说明就好了)

【问题讨论】:

  • 第一个问题没看懂。 (2) 在 cpp 参考中,您可以举例说明缺少总排序的可能后果 - 当使用较少强制的内存操作时。如果没有全序,您将无法判断哪些事件以何种顺序发生。恕我直言,它并不是特别有用,还没有看到一个真实的用例。

标签: c++ multithreading atomic memory-barriers stdatomic


【解决方案1】:

(1) 不,seq_cst 操作 不像atomic_thread_fence(memory_order_seq_cst) 那样正式成为 seq_cst 障碍On some machines seq_cst 存储最终在 asm.xml 中使用了一个完整的屏障。请参阅https://preshing.com/20130922/acquire-and-release-fences/ re:获取和释放操作(允许单向重新排序)与获取和释放的栅栏; seq_cst 也有类似的情况。

即使在实践中,seq_cst 负载在许多机器上也比完全围栏弱,并不能阻止它们之间的某些类型的重新排序。

在 AArch64 上,seq_cst pure-load 和 pure-store 是通过特殊指令完成的,这些指令不会相互进行 StoreLoad 重新排序,而是 wrt。普通的存储和加载指令,它们仅具有获取和释放操作的语义操作。 (允许单向重新排序:https://preshing.com/20120913/acquire-and-release-semantics/)。

另见


(2) 保证没有 IRIW 重新排序。 Will two atomic writes to different locations in different threads always be seen in the same order by other threads? 有一个答案,解释了 POWER 硬件如何在实践中实际产生这种重新排序(对于 mo_acq_rel 或更弱)。

这是其中一种情况,其中被保证的事情是您可能没想到的是首先需要担心的事情。 :P 大多数硬件(以及大多数 ISA 纸上规范)都是多副本原子的,并且确实保证了所有观察者都可以同意的存储的单一总顺序。 (但请注意,加载数据可以来自 store-fowarding:Globally Invisible load instructions

【讨论】:

    猜你喜欢
    • 2010-10-11
    • 1970-01-01
    • 2021-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多