想象一下N个线程在运行以下简单代码:
int res = num.fetch_add(1, std::memory_order_relaxed);
其中num
是:
std::atomic<int> num = 0;
完全安全地假设,运行代码的每个线程的res
会有所不同,或者某些线程可能相同吗?
答案 0 :(得分:4)
是的。所有线程都将同意各个线程修改变量num
的顺序;执行该行代码的第k个线程肯定会获得值k。但是,使用std::memory_order_relaxed
意味着对num
的访问不会彼此同步;因此,例如,一个线程可能在修改x
之前修改了其他原子变量num
,而另一个线程可能看到了前一个线程对num
的修改,但随后看到了旧的值x
。