从c++ 11 29.3-p3:
在最后一个注释中,“始终”是什么意思?
我可以理解,可以将任何特定的实现设计为支持这样的扩展S。但是,在某些并非为此设计的通用实现中,我看不到可以使用所描述的属性来扩展S。
这是否意味着在这里也满足相同可见性属性的扩展订单?
我已经将这个问题发送到comp.std.c++,但是那里没有任何答案。 http://groups.google.com/group/comp.std.c++/browse_frm/thread/5242fa70d0594d1b#
最佳答案
始终表示S+l
上的seq_cst ops U lock ops
总订单与happens-before
和S
一致。
这是为什么
事实1:S
是与HB
一致的总订单。
事实2:锁定操作是按HB
部分顺序排序的,因为它们是获取/释放操作。
事实3:HB
中没有循环。
引理1:S' = S union HB
中没有循环。
证明:如果S'
中有任何循环,则它们的形式应为Aop1 <S Aop2 <HB Aop1
,因为任何两个原子操作在S
中都是可比的,并且-before-before是可传递的。这将与事实1相矛盾。
结论:因为对于每个部分顺序(=无循环),存在对总顺序的扩展(请参阅拓扑排序),因此存在对S'
进行扩展的总顺序。因此,您只需选择原子并从中锁定操作并获得S+l
即可。
这样的实现将不满足mem_order_seq_cst
的要求。
关于c++ - c++ 11原子排序: extended total order memory_order_seq_cst for locks,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10869322/