能否翻译一下下面这段出自于《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,所以不管怎样就给取走了值。
推荐阅读
- 汽车知识|押宝全新造型,东风雪铁龙新C5能否成为神龙公司“救世主”
- 中国版Evan能火吗美国9岁男童录制评测玩具视频年入800万,中国能否复制成功
- 汽车市场|中期改款再战D级车市场,新雷克萨斯LS能否超过宝马7系等对手?
- 建议|育婴师给出这几点建议,来了解一下小孩发烧咳嗽怎么办
- 澎湃汽车圈|试驾名爵MG领航 运动性和实用性能否兼顾?
- 天天汽车|超高性价比实力宠粉,2021款奕歌能否点燃你的心?
- 能否推荐一个能用快播看电影且电影都是中英双字幕的网站
- 车祸违驾|为什么交警在查车时,会用手摸一下车尾,你知道是什么意思吗?
- 有哪些做短视频的自媒体推荐
- 想买个30w—50w的轿车,外形优雅精致,气质沉静内敛。要能够顾家,稳定,安全性能好。请帮忙推荐一下
