内存序
今天看内存序看的要崩溃了,太乱了,不同人的博客常常出现前后不一致的情况。这个工作只是临时起意,也不是什么意义重大的工作,因此也没有寻找更权威的资料,最主要的参考是cplusplus上的reference,如果有错误之外,真心希望您来指正一下,自己真的逐个字死磕类型的。
为何需要内存序
在实际的程序运行过程中,如果不使用任何的同步原语,那么很多变量的执行结果,乃至程序的最终行为是无法预料的。具体来说,影响主要有以下几个点:
- 编译器指令的重新排列:编译器出于优化的考虑,会对生成的指令代码进行重新排列,而排列的代码可能在多线程运行中引起不可预料的结果。要注意的是,在单线程"顺序执行"的情况下,这种重排并不会影响程序结果。
- cpu cache:例如对内存的某个变量的写操作,可能先写入了cache,而并没有立刻被其他线程看到
- 指令的非原子性:例如某个操作需要涉及多条指令,而我们希望这个操作是个原子操作,不能被其他线程看到操作的中间结果(因为中间结果可能无任何意义)。
为了能够准确的控制内存读写操作的可见性,保证多线程的读写情况下变量结果的正确,需要一定的内存序的语义支持。传统的方案常采用锁机制,以控制多线程之间的并行访问,但是它的代价相对较高