volatile 和sig_atomic_t
2016-05-01 11:48
330 查看
例如:
volatile int i=10;
int j = i;
...
int k = i;
volatile 告诉编译器i是随时可能发生变化的,每次使用它的时候必须从i的地址中读取,因而编译器生成的可执行码会重新从i的地址读取数据放在k中。
而优化做法是,由于编译器发现两次从i读数据的代码之间的代码没有对i进行过操作,它会自动把上次读的数据放在k中。而不是重新从i里面读。这样以来,如果i是一个寄存器变量或者表示一个端口数据就容易出错,所以说volatile可以保证对特殊地址的稳定访问,不会出错。
sig_atomic_t:
当把变量声明为该类型是,则会保证该变量在使用或赋值时, 无论是在32位还是64位的机器上都能保证操作是原子的,
它会根据机器的类型自动适应。
今天看源代码时,看到sig_atomic_t这个类型,平时用得较少,平时一般是用int类型来代替。
这个类型是定义在signal.h文件中。下面来说说这个类型。
在处理信号(signal)的时候,有时对于一些变量的访问希望不会被中断,无论是硬件中 断还是软件中断,这就要求访问或改变这些变量需要在计算机的一条指令内完成。通常情况下,int类型的变量通常是原子访问的,也可以认为 sig_atomic_t就是int类型的数据,因为对这些变量要求一条指令完成,所以sig_atomic_t不可能是结构体,只会是数字类型。
在linux里这样定义:
typedef int __sig_atomic_t;
另外gnu c的文档也说比int短的类型通常也是具有原子性的,例如short类型。同时,指针(地址)类型也一定是原子性的。 该类型在所有gnu c库支持的系统和支持posix的系统中都有定义。
volatile int i=10;
int j = i;
...
int k = i;
volatile 告诉编译器i是随时可能发生变化的,每次使用它的时候必须从i的地址中读取,因而编译器生成的可执行码会重新从i的地址读取数据放在k中。
而优化做法是,由于编译器发现两次从i读数据的代码之间的代码没有对i进行过操作,它会自动把上次读的数据放在k中。而不是重新从i里面读。这样以来,如果i是一个寄存器变量或者表示一个端口数据就容易出错,所以说volatile可以保证对特殊地址的稳定访问,不会出错。
sig_atomic_t:
当把变量声明为该类型是,则会保证该变量在使用或赋值时, 无论是在32位还是64位的机器上都能保证操作是原子的,
它会根据机器的类型自动适应。
今天看源代码时,看到sig_atomic_t这个类型,平时用得较少,平时一般是用int类型来代替。
这个类型是定义在signal.h文件中。下面来说说这个类型。
在处理信号(signal)的时候,有时对于一些变量的访问希望不会被中断,无论是硬件中 断还是软件中断,这就要求访问或改变这些变量需要在计算机的一条指令内完成。通常情况下,int类型的变量通常是原子访问的,也可以认为 sig_atomic_t就是int类型的数据,因为对这些变量要求一条指令完成,所以sig_atomic_t不可能是结构体,只会是数字类型。
在linux里这样定义:
typedef int __sig_atomic_t;
另外gnu c的文档也说比int短的类型通常也是具有原子性的,例如short类型。同时,指针(地址)类型也一定是原子性的。 该类型在所有gnu c库支持的系统和支持posix的系统中都有定义。
相关文章推荐
- BootStrap glyphicons 字体图标实现方法
- ssm框架配置要点
- 解决绝对定位居中的问题
- 第 26 章 CSS3 动画效果
- Servlet初了解(二)
- VIM 中 查看{}是否闭合,按%跳转到下个闭合
- 贝叶斯定理及应用
- 反汇编小作业
- 利用java自动生成验证码
- 机器学习笔记(八)——决策树模型的特征选择
- 链表求和
- Topological Sort
- eclipse如何卸载插件
- UIScrollView基本使用(一)
- Increasing Triplet Subsequence
- 推荐几个前端的教程
- 执行控制——节流模式
- 软考信息系统监理师,2016年4月29日作业
- win10安装nginx
- 简单高效可靠的自定义通信协议(传输协议)