AtomicPointer是LevelDB中的一个基础数据结构,其核心代码只有寥寥10来行。
但是,为了理解这10来行代码,却需要十分扎实的CPU架构、操作系统、编译器、C++11知识。
为了搞明白其背后的原理,同时加深理解,我准备从以下几点着手,一步步抽丝剥茧:
- 什么是乱序执行 ?
- 什么是Memory Barrier ?
- Platform-Specific的AtomicPointer实现
- C++11内存模型
- C++11下的AtomicPointer实现
什么是乱序执行 ?
常用的编程语言中,均提供了“顺序执行“的语义。
就是,单个执行流中的语句,我们总可以将其理解成“逐条执行”。
那么,“乱序执行”又从何谈起呢?
为了理解“乱序执行”,我们需要拨开高级语言的抽象,深入到计算机组成原理中。
以“x = 42”为例,其对应的汇编指令一般包含这几步操作:
1)从x的内存地址加载数据到内存中;
2)修改寄存器中的值;
3)将寄存器中的数据,回写到内存中;
因此,即便是简单的赋值操作,也可能不是Atomic操作(当然,这也取决于具体的CPU架构)。
赘述下就是,两条C语句在被编译成汇编指令时,产生远不止两条的汇