【问题标题】:Will fetch_add with relaxed memory order return unique values?具有宽松内存顺序的 fetch_add 会返回唯一值吗?
【发布时间】:2019-02-11 21:29:35
【问题描述】:

想象一下 N 个线程按照简单的代码运行:

int res = num.fetch_add(1, std::memory_order_relaxed);

num 在哪里:

std::atomic<int> num = 0;

假设运行代码的每个线程的res 是否完全安全,或者某些线程可能相同?

【问题讨论】:

    标签: c++ concurrency atomic memory-model relaxed-atomics


    【解决方案1】:

    是的。所有线程将就各个线程修改变量num的顺序达成一致;执行该行代码的第 k 个线程肯定会获得值 k。然而,std::memory_order_relaxed 的使用意味着对num 的访问不会相互同步。因此,例如,一个线程可能会在修改num 之前修改某个其他原子变量x,而另一个线程可能会看到前一个线程对num 所做的修改,但随后会看到x 的旧值。

    【讨论】:

      猜你喜欢
      • 2017-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多