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 ++规范或硬件的隐含保证,还是有条件的内存陈旧标准文件保证?
答案 0 :(得分:4)
好问题!这实际上是由C ++ 11标准的§1.10中的第25条专门解决的:
实现应该确保由atomic或者分配的最后一个值(按修改顺序) 同步操作将在有限的时间内对所有其他线程可见。
所以答案是肯定的,即使放松了内存排序,该值也可以保证最终传播到另一个线程。