C++原子操作总结
关于乱序 c++程序中,没有依赖关系的语句的执行顺序是无法预测的。 乱序的原因 1. 编译器优化。编译器优化假设程序是单线程环境时,如果编译器出于某种原因会对程序执行顺序并且不会改变其结果,此时是可以乱序执行的。编译器一般不会将函数之后的指令移到函数前面,因为编译器一般不知道函数体内是否含有memory barrier 2. 处理器优化。处理器允许指令乱序,这样避免指令等待资源而暂时hang住,处于闲置状态。eg. cache miss。如果当前指令cache miss,下一条命中,则可能会乱序执行。 3. 存储系统。在每个cpu核中都存在一个store buffer(可以理解成一些特殊寄存器)。在一些写指令执行的时候,写的数据先存在各自的store buffer中,只有自己感知得到,这之后会以先进先出的方式往l2 cache等逐级向下到内存中。而存往store buffer时,cpu就已经认为这条指令执行结束了,因此可能产生乱序。 直面乱序 1. 乱序执行不可避免 2. 如果读写指令涉及的不是共享变量,则不会有坏影响 3. 否则,应该用锁或者原子变…