放松记忆模型可以在同一个线程上重新排序吗



我想知道,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无法打印。这是由于上面的第一条规则:每个线程都按顺序执行。

相关内容

  • 没有找到相关文章

最新更新