从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-beforeS一致。

这是为什么

事实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/

10-11 22:30