将 fetch_add 与 relaxed memory order return 唯一值?
Will fetch_add with relaxed memory order return unique values?
假设 N 个线程 运行 遵循简单的代码:
int res = num.fetch_add(1, std::memory_order_relaxed);
其中 num
是:
std::atomic<int> num = 0;
是否可以完全安全地假设,res
每个线程的代码 运行 代码会不同,或者某些线程的代码可能相同?
是的。所有线程都会同意各个线程修改变量的顺序num
;第k个执行那行代码的线程肯定会得到k值。但是,std::memory_order_relaxed
的使用意味着对 num
的访问不会相互同步;因此,例如,一个线程可能会在修改 num
之前修改其他一些原子变量 x
,而另一个线程可能会看到前一个线程对 num
所做的修改,但随后会看到旧的x
.
的值
假设 N 个线程 运行 遵循简单的代码:
int res = num.fetch_add(1, std::memory_order_relaxed);
其中 num
是:
std::atomic<int> num = 0;
是否可以完全安全地假设,res
每个线程的代码 运行 代码会不同,或者某些线程的代码可能相同?
是的。所有线程都会同意各个线程修改变量的顺序num
;第k个执行那行代码的线程肯定会得到k值。但是,std::memory_order_relaxed
的使用意味着对 num
的访问不会相互同步;因此,例如,一个线程可能会在修改 num
之前修改其他一些原子变量 x
,而另一个线程可能会看到前一个线程对 num
所做的修改,但随后会看到旧的x
.