一、原子操作
原子操作是一系列不可中断的操作的集合,它的执行过程是封闭的,不可打断的。在单处理系统中,能够在单条指令中完成的操作都可以认为是原子操作。在对称多处理器结构中,即使能在单条指令中完成的操作也有可能被打断。原子性不可能由软件单独保证,必须有硬件的支持,因此是和平台相关的,而且通常使用汇编语言实现。原子操作保护的资源通常被定义成原子型整数(atomic_t)类型:
typedef struct { volatile int counter;} atomic_t;
volatile 修饰符告诉编译器不要对该类型的数据做优化处理。
原子操作包含整数型和比特型,见下表。
类型 | 函数原型 | 说明 |
---|---|---|
atomic_read(atomic_t* v); | 原子读操作 | |
整 | atomic_set(atomic_t* v, int i); | 设置原子类型的变量 v 的值为 i |
数 | void atomic_add(int i, atomic_t* v); | 给原子类型的变量 v 增加值 i |
型 | void atomic_sub(int i, atomic_t* v); | 从原子类型的变量 v 中减去 i |
int set_bit(int nr, void* addr); | 对给定地址 addr 的第 nr bit 进行置位 | |
比 | int clear_bit(int nr, void* addr); | 对给定地址 addr 的第 nr bit 进行清位 |
特 | int test_bit(int nr, void* addr); | 检测给定地址 addr 的第 nr bit 的值 |
型 | int change_bit(int nr, void* addr); | 使地址 addr 的第 nr bit 发生跳转(0变为1,1变为0) |