【问题标题】:atomic load store with memory order具有内存顺序的原子加载存储
【发布时间】:2018-10-22 10:13:32
【问题描述】:

线程A首先运行x.store(1, std::memory_order_release), 然后线程 B 运行x.load(std::memory_order_acquire)。 线程 B 中的x 不保证读取 A 存储的 1。

如果我用memory_order_seq_cst,能保证读到1吗?

【问题讨论】:

    标签: c++ multithreading thread-safety memory-model stdatomic


    【解决方案1】:

    线程 A 先运行 x.store(1, std::memory_order_release),然后运行线程 B 运行 x.load(std::memory_order_acquire)。

    你怎么知道一个线程一个接一个地做了一个操作?

    主要是通过测试共享状态?像一个原子?

    因此,确定假设是否为真的方法是……检验结论:“读取 A 存储的 1”是真还是假。

    所以这个问题读起来就像一个重言式(如果 x 是 2+2,x 等于 2+2)或循环。

    【讨论】:

      【解决方案2】:

      在加载/存储一个原子变量方面,内存排序没有区别。这是因为 std::memory_order 指定了如何围绕原子操作对内存访问(包括常规的非原子内存访问)进行排序。

      阅读std::memory_order 了解完整详情。特别是:

      对任何特定原子变量的所有修改都以特定于该原子变量的总顺序发生。

      【讨论】:

      • "如何围绕原子操作对常规的非原子内存访问进行排序" 只有非原子操作?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-12
      • 1970-01-01
      • 2022-08-11
      • 2021-08-27
      • 2010-11-02
      相关资源
      最近更新 更多