volatile和sig_atomic_t
来源:互联网 发布:免费远程桌面控制软件 编辑:程序博客网 时间:2024/05/22 14:18
volatile
影响编译器编译的结果,指出,volatile 变量是随时可能发生变化的,每次使用时都需要去内存里重新读取它的值,与volatile变量有关的运算,不要进行编译优化,以免出错,(VC++ 在产生release版可执行码时会进行编译优化,加volatile关键字的变量有关的运算,将不进行编译优化。)。 例如:
int j = i;
...
int k = i;
建议使用volatile变量的场所:
(1) 并行设备的硬件寄存器
(2) 一个中断服务子程序中会访问到的非自动变量(全局变量)
(3) 多线程应用中被几个任务共享的变量
volatile和__volatile__
volatile表达的是同一意思。
b. volatile的本意是"易变的",由于访问寄存器的速度快于访存,所以编译器一般
都会作优化以减少访存。如果变量加上volatile修饰,则编译器就不会对此变量
的读写操作进行优化,即不通过寄存器缓冲而直接访存。
c. __asm__ __volatile__一起指示编译器不要改动优化后面的汇编语句。
sig_atomic_t
今天看APUE时,看到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的系统中都有定义。
Linux内核的原子操作 atomic_t
原型:
typedef struct {
volatile int counter;
} atomic_t;
1 声明,定义并初始化原子变量
atomic_t isopen = ATOMIC_INIT(1);
2 使用方法
原子变量自减1,并测试是否为0,如果为0,返回true,否则返回false
if( !atomic_dec_and_test(&isopen) ) {
atomic_inc(&isopen); //加1操作
return -EBUSY;
}
3 释放
减1操作
atomic_dec(&isopen);
0 0
- volatile 和 sig_atomic_t
- 再谈volatile和sig_atomic_t
- volatile和sig_atomic_t
- volatile 和 sig_atomic_t
- volatile 和sig_atomic_t
- volatile 和 sig_atomic_t
- 小学一下volatile和sig_atomic_t类型.
- sig_atomic_t类型与volatile限定符
- sig_atomic_t
- sig_atomic_t
- sig_atomic_t
- 谈谈volatile和const
- 关于volatile和synchronized
- volatile和__volatile__是什么意思?
- volatile和__volatile__是什么意思?
- 关于volatile和synchronized
- volatile和原子操作
- volatile和原子操作
- JDBC存储和读取二进制数据
- Android:最新最全的验证正确手机号码的工具类——诺诺"涂鸦"记忆
- 电路中的电源符号
- [ZJOI2007]报表统计 解题报告
- Linus Torvalds 谈为什么他表现粗鲁
- volatile和sig_atomic_t
- win7下简单配置sublime text2
- Android MediaStore之Audio常用属性变量
- S3C2440 LCD驱动(FrameBuffer)实例开发
- 2 单用户client向单线程服务器不停地发送数据
- 【效率至上】如何才能有效提高工作效率
- 电子行业技术网站收集
- java 类的单继承与接口的多继承
- 如何得到空间相对于窗口的位置