能否翻译一下下面这段出自于《c++ concurrency in action》中关于C++内存模型的描述( 二 )


and the initial store synchronizes-with (for memory_order_acquire or memory_order_
seq_cst) or is dependency-ordered-before (for memory_order_consume) the final
load. Any atomic read-modify-write operations in the chain can have any memory
ordering (even memory_order_relaxed).
上面那段话的基本意思是:如果有一个线程A对一个atomic对象调用了write操作,假设使用的是std::memory_order_release,而线程B对这个atomic对象调用了read操作,假设使用的是std::memory_order_acquire,那么即使线程A在之前的那个write之后,在线程B的read之前有一个使用std::memory_order_relaxed的写操作,也不会影响没有这个write操作建立的同步(synchronize-with)关系,而且线程B读到的是线程A第二次write的值。如果期间存在线程对这个atomic对象调用读写操作,那么线程A的写操作(使用std::memory_order_release)与线程B的读取操作(使用std::memory_order_acquire)仍然存在同步(synchronize-with)关系,而且中间的读写操作读取的是线程A写的值,线程B读取的是中间读写操作写的值,即使中间读写操作使用的std::memory_order_relaxed。当然,写操作和读操作不是一定需要用上面说的两种内存序(memory_order),可以选择其他能够建立同步(synchronize-with)关系的内存序。

■网友
理解这个问题就要理解cpu的工作原理,我们直觉上cpu是一句一句指令执行的,但实际上不是这样。会改变指令执行顺序有这么几种情况:编译器改变语句顺序,这个是最好理解的,包括NRO优化;多任务系统偷跑,比如说你刚刚看到语句一执行,但实际上系统把语句打成微指令,并行执行了语句一到语句十的指令,恰好语句一的计算结果已全部结束,你就看到了语句一,但语句二到语句十已经在计算了,而且也开始写缓存了。branch分支处理,你在宏观上看到一个if else 或者switch,虽然告诉你if如果执行了,else不执行,但一般多核CPU还是会在空闲的CPU上执行else,switch同理多级缓存导致查询时效错误,这个和relaxed关系很大,线程A的某个结果被换页到一级缓存,线程B刚好在计算他,但慢了半步,其实A在逻辑上应晚于B,但线程C进来的时候刚好看到线程B在操作它,因为设的relaxed,所以不管怎样就给取走了值。


推荐阅读