volatile关键字 Sk8er

在程序执行的时候有可能遇到动态调度指令的问题,例如解决CPU的数据相关问题,就有可能将不相干的指令交换顺序,这在单线程没有问题,但是在多线程中就有可能出现问题。

例如:

x = y = 0;

thread1()        thread2()

{            {

  x = 1;          y = 1;

  r1 = y;          r2 = x;

}            }

有可能被CPU优化成:

thread1()        thread2()

{            {

  r1 = y;          r2 = x;

  x = 1;          y = 1;

}            }

 若这两个线程并发执行就会造成r1 = r2 = 0的情况。

解决办法就是使用volatile关键字来阻止过度优化。

volatile关键字有两个功能:

1. 阻止编译器为了提高速度将一个变量缓存到寄存器内而不写回。

2. 阻止编译器调整操作volatile变量的指令顺序。

但是这种做法只能阻止编译器调整顺序,对于CPU动态调换指令顺序就没有办法阻止了。

原文地址:https://www.cnblogs.com/f8915345/p/3085673.html