无锁编程里最复杂,最难理解的莫过于是内存顺序。
乱序
程序不一定会按照源代码的顺序执行,这称之为乱序。乱序的必须遵循的原则是:在单线程执行下,乱序与不乱序执行的结果必须相同。所以,在单线程的环境里不需要注意乱序的问题,而到了多线程环境就需要考虑乱序。
乱序产生的原因有好几种:
- 编译器优化,在编译阶段将源码交换。
- 程序执行期间,指令流水被CPU乱序执行。
- inherent cache 的分层及刷新策略使得有时候某些写读操作的从效果上看,顺序被重排。
Release和Acquire语义
大约 4 分钟