我想知道,memory_order_relaxed
是否允许在同一线程上不受约束地重新排序代码?例如:
// All on the same thread
std::atomic_int num(10);
std::cout << num.load(memory_order_relaxed) << "n";
num.store(0, memory_order_relaxed);
有可能打印0吗?(在实际代码中,另一个线程正在修改num
,但与之无关(
"重新排序"对于多线程代码来说并不是一种有用的思考方式,因为它非常不精确。相反,我们应该观察以下内容:
- 每个线程都按顺序执行
- 程序中的每个原子变量都有一个单独的修改顺序,所有线程都同意
- 不存在修改不同原子变量的单一顺序(除非这些原子变量仅通过顺序一致的操作访问(
- 一个线程可能不会观察到由另一个线程以实际发生此类修改的相同顺序修改的两个不同原子变量的副作用。例如,线程1可以修改原子变量
a
,然后修改原子变量b
。线程2可以观察b
的新值,然后观察a
的旧值。这就是大多数人认为的";重新排序">
在您的问题中,答案是否定的,0无法打印。这是由于上面的第一条规则:每个线程都按顺序执行。