什么保证弱松弛的无竞争CAS循环终止?

时间:2015-03-16 18:19:53

标签: c++ concurrency atomic

cppreference's page on compare_exchange给出了以下示例代码(释义代码段):

while(!head.compare_exchange_weak(new_node->next,
                                  new_node,
                                  std::memory_order_release,
                                  std::memory_order_relaxed))
      ; // empty body

假设您在线程A上运行一次,在线程B上运行一次。没有其他任何内容触及head或其关联数据。线程B的调用恰好在线程A发生后(实时)启动,但A的更改尚未传播到运行线程B的CPU的缓存中。

什么迫使A的变化到达B?也就是说,为什么B的弱比较交换的执行只是无限期地失败并且CPU缓存仍然过时而不允许?还是允许的?

似乎运行B的CPU没有被强制熄灭并同步A所做的更改,因为失败内存排序是放松的。那么为什么硬件会这样做呢?这是C ++规范或硬件的隐含保证,还是有条件的内存陈旧标准文件保证?

1 个答案:

答案 0 :(得分:4)

好问题!这实际上是由C ++ 11标准的§1.10中的第25条专门解决的:

  

实现应该确保由atomic或者分配的最后一个值(按修改顺序)   同步操作将在有限的时间内对所有其他线程可见。

所以答案是肯定的,即使放松了内存排序,该值也可以保证最终传播到另一个线程。