1.编译器的优化魔法
在没有同步原语的情况下,编译器可以(通常是为了性能)在(当前线程)结果不变的情况下
自由地调整执行顺序:
(1)同步源于包括互斥锁操作,内存屏障和原子操作等:
(2)被调整的例子:
例子:x = a; y = 2;可以变成:y = 2;x=a;
例子:x = y + 1;y = x+2;可以变为 t = y; y+=3; x= t+1;
(3)局部变量可能被完全消除;
(4)全局变量只保证在下一个同步点来之前写回到内存里;
(5)volatile声明会禁止编译器进行相关的优化.
2.防止优化的技巧
1.使用全局变量;
2.使用锁来当做简单的内存屏障;
3.可使用__attribute__((noinline))来防止意外内联;
4.引用变量来防止其被优化掉.