带有宽松存储顺序的fetch_add是否会返回唯一值?

时间:2019-02-11 21:29:35

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

想象一下N个线程在运行以下简单代码:

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

其中num是:

std::atomic<int> num = 0;

完全安全地假设,运行代码的每个线程的res会有所不同,或者某些线程可能相同吗?

1 个答案:

答案 0 :(得分:4)

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