具有宽松内存顺序的 fetch_add 会返回唯一值吗?

bar*_*top 7 c++ concurrency atomic memory-model relaxed-atomics

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

int res = num.fetch_add(1, std::memory_order_relaxed);
Run Code Online (Sandbox Code Playgroud)

在哪里num

std::atomic<int> num = 0;
Run Code Online (Sandbox Code Playgroud)

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

Bri*_*ian 9

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