转载过来有三个原因: 1.我和李先静有过email交流,他的ftk非常好。他写的书《系统程序员成长计划》,我详细读过其中几张,由于其中一些理念,我并不到赞同。因此没有继续读完。但其本人非常NICE,而且水平很高。 2.陈怀临,弯曲评论的创建者,首席科学家。一把年龄了,还钻研这些细小问题,赞! 3.volatile变量,我之前研究过,但不详细。 罗嗦太多了,抱歉!下面是正文,推荐大家到弯曲评论中去看,评论更精彩 ----------------------------------------------------------------------------------------- 本文转自:弯曲评论 下面是一段简单的代码,试图对李先静文章中的volatile进行一些量化分析。变量foo是一个static变量。下面分析了non volatile和volatile的不同的汇编语言结果。 static int foo; void bar(void) { foo = 0; while (foo != 255) ; } .text .align 4,0×90 .globl _bar _bar: LFB2: pushq %rbp LCFI0: movq %rsp, %rbp LCFI1: movl $0, _foo(%rip)//变量初始化为0 L2: jmp L2//死循环,因为编译优化,认为foo变量永远是0; 如果对变量做volatile处理,禁止编译优化。 static volatile int foo; void bar(void) { foo = 0; while (foo != 255) ; } .text .align 4,0×90 .globl _bar _bar: LFB2: pushq %rbp LCFI0: movq %rsp, %rbp LCFI1: movl $0, _foo(%rip) //foo变量赋初值为0 .align 4,0×90 L2: movl _foo(%rip), %eax //必须force做memory的load操作。从而在多CPU下,或者系统 //中有其他逻辑,例如DMA,FPGA操作的情况下,CPU能感知 cmpl $255, %eax jne L2 //如果变量有变化,函数返回 leave//离开while控制逻辑 ret -- Li Haifeng Laboratory of Service Computing Technology and System Home page:http://tek-life.org