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对于每个运行代码的线程来说是否完全安全,或者对于某些线程来说它可能是相同的?
是的。所有线程将同意各个线程修改变量的顺序num;执行该行代码的第 k 个线程肯定会获得值 k。使用的std::memory_order_relaxed,但是,意味着访问num不会互相同步; 因此,例如,一个线程可能会在修改x之前修改某个其他原子变量num,而另一个线程可能会看到num前一个线程对所做的修改,但随后会看到 的旧值x。