- 功能
本文基于5.15.133版本讨论。
主要是防止编译器对代码进行顺序优化从而导致未知的错误。
关于这个问题,Documentation/memory-barriers.txt中提到的下面这个例子非常典型。
例子里面有三条赋值语句。注意,这三条语句互相之间没有任何赋值依赖关系。在这种情况下,编译器进行顺序优化后可能导致赋值语句的各种先后顺序。这可能导致问题,比如线程A有下列赋值语句:
- int flag = 0;
- int val = 0;
- val++;
- flag = 1;
线程B的运行受变量flag控制:
- if (flag == 1)
- val--;
- printf("val: %d\n", val);
线程A的两条赋值语句可能被顺序优化,这样线程B可能会错误的打印出-1。
2.定义
对于READ_ONCE:
第一句检查变量x的类型,需要时8,16,32,64位数据类型。
第二句主要对访问变量进行volatile类型转换访问:
WRITE_ONCE:
volatile的基础功能:
- 防止易变变量的读写被编译器优化为对寄存器的操作。
- 防止编译器的顺序优化。
所以对于有对编译器顺序优化要严格控制的读写语句,要用READ_ONCE和WRITE_ONCE控制一下。