全局排序和每原子变量排序有何不同
How does global ordering and per atomic variable ordering differ?
我正在努力理解memory_order_seq_cst和memory_order_aq_rel之间的区别。SO上的一些帖子已经涵盖了这个问题,然而,我不明白他们的答案。
这个帖子说
memory_order_aq_rel提供相对于原子变量的读和写顺序,而memory_orden_seq_cst提供全局读和写排序。
它还包括一个示例
bool x= false;
bool y= false;
bool z= 0;
a() { x= true; }
b() { y= true; }
c() { while (!x); if (y) z++; }
d() { while (!y); if (x) z++; }
// kick off a, b, c, d, join all threads
assert(z!=0);
这个片段是cppreference.com上一个例子的骨架版本。我在Ideone和CoLiRu上编译了这个例子。在Ideone上,在memory_order_aq_rel和memory_orden_seq_cst下,z可以是1或2。在CoLiRu上,我只能得到2。它从来都不是0。
我的问题是:
- while(!x)和while(!y)是否保证if(y)或if(x)返回true,即使我们使用每原子变量排序
- 这个例子如何解释memory_order_aq_rel和memory_orden_seq_cst之间的区别
- 有人能提供一个使用内存栅栏的例子来说明每原子变量排序和全局排序之间的区别吗
c++11标准将seq_cst定义为
所有memory_order_seq_cst操作都应有一个总订单S,与所有受影响位置的"发生之前"订单和修改订单一致。。。
请注意,这些操作可能在不同的内存位置上。在acq_rel排序的情况下,该顺序仅在相关的内存位置上保持。
在您提供的示例中,我假设当您说"under memory_order_aq_rel"时,您的意思是说程序中的所有存储和加载都有memory_order_aq_rel(与memory_orden_seq_cst相同)。memory_order_seq_cst的排序要求将对x
和y
的所有加载/存储操作强制执行总顺序,这意味着x=true;
发生在y=true
之前,或者y=true
发生在x=true
之前。因此CCD_ 7的可能值为1或2。而在memory_order_acq_rel的情况下,如果线程c中加载的x
和y
的值分别为1和0,并不意味着线程d不能将y
读取为1,将x
读取为0。在这种情况下,CCD_ 12的值将为0。因此,这允许z
的值为0、1或2。
- 如何对不在数组中的变量进行排序?
- 按字母顺序对结构内数组变量中的名称进行排序
- C++排序向量<double>与在<Object>双成员变量上键控的向量
- 如果我将索引变量更改为零,并且合并函数中的k = 0,则获得合并排序的错误结果
- 如何对对象数组进行排序,而不考虑对象变量类型
- CUDD:提取变量排序
- 使用条件变量并联对向量的向量进行排序
- 对变量上的标准构造进行排序
- C 如何对数组变量进行排序
- 如何通过私有字符串变量按字母顺序对对象向量进行排序
- 根据类中的变量对类向量进行排序
- 如何制作一个集合,其中元素使用局部变量进行排序
- 排序变量C++
- std::map,自定义键类型,仅对一个变量进行排序
- 对其中一个变量的多变量结构进行排序
- 按结构内的变量对结构向量进行排序
- STL 按变量排序,然后按升序排序
- 全局排序和每原子变量排序有何不同
- std::vect使用成员变量排序
- 如何获取用户输入并按变量排序