READ_ONCE和WRITE_ONCE

  1. 功能

本文基于5.15.133版本讨论。

主要是防止编译器对代码进行顺序优化从而导致未知的错误。

关于这个问题,Documentation/memory-barriers.txt中提到的下面这个例子非常典型。

例子里面有三条赋值语句。注意,这三条语句互相之间没有任何赋值依赖关系。在这种情况下,编译器进行顺序优化后可能导致赋值语句的各种先后顺序。这可能导致问题,比如线程A有下列赋值语句:

  1. int flag = 0;  
  2. int val = 0;  
  3.   
  4. val++;  
  5. flag = 1;  

线程B的运行受变量flag控制:

  1. if (flag == 1)  
  2.     val--;  
  3.   
  4. printf("val: %d\n", val); 

线程A的两条赋值语句可能被顺序优化,这样线程B可能会错误的打印出-1。

2.定义

对于READ_ONCE:

第一句检查变量x的类型,需要时8,16,32,64位数据类型。

第二句主要对访问变量进行volatile类型转换访问:

WRITE_ONCE:

volatile的基础功能:

  1. 防止易变变量的读写被编译器优化为对寄存器的操作。
  2. 防止编译器的顺序优化。

所以对于有对编译器顺序优化要严格控制的读写语句,要用READ_ONCE和WRITE_ONCE控制一下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值