【问题标题】: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 的旧值。