代码改变世界

C++原子操作sig_atomic_t

2020-10-12 17:47  宋海宾  阅读(765)  评论(0编辑  收藏  举报

sig_atomic_t这个类型是定义在signal.h文件中。

当把变量声明为该类型会保证该变量在使用或赋值时, 无论是在32位还是64位的机器上都能保证操作是原子的, 它会根据机器的类型自动适应。
这个类型是定义在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);