什么是内存屏障
官方: http://www.kernel.org/doc/Documentation/memory-barriers.txt,
内存屏障其实就是因为编译器优化和CPU对寄存器和cache的使用,导致对内存的操作不能够及时的反映出来,比如cpu写入后,读出来的值可能是旧的内容。举个例子,对一个变量赋值然后读出它的值这一看似“原子”的操作,因为内存是没有ALU计算单元的,所以内存没有计算的能力。而CPU一般情况下是不直接读写内存的(emmintrin.h应用例外),所以这一个过程可以看作(编译器优化后):
读取内存数据到cache --> CPU读取cache/寄存器 --> CPU的计算 --> 将结果写入cache/寄存器 --> 写回数据到内存
有人可能会问,为什么要这么麻烦,因为是编译器优化和CPU优化的结果,内存的时延比CPU高的多,是10ns级别,所以会通过读写寄存器或拆cache优化。这有可能导致一个问题,cache中的数据和内存实际的数据不一致,当多线程情况下,有可能会读"脏数据",或者带来线程执行结果不一致。这就是所谓的“内存屏障”(但不仅限于此case)。
内存屏障,也叫内存栅栏(Memory Fence)。分编译器屏障(Compiler Barrier,也叫优化屏障)和CPU内存屏障,其中编译器屏障只对编译器有效,它们的定义如下表所示(限x86,其它架构并不相同):
无锁编程
多线程编程是多CPU系统在中应用最广泛的一种编程方式,在传统的多线程编程中,多线程之间一般用各种锁的机制来保证正确的对共享资源(share resources)进行访问和操作。
而在使用锁机制的过程中,即便在锁的粒度(granularity),负载(