原子操作仅执行一次,在执行过程中不会中断也不会休眠;是最小的执行单元;鉴于原子操作这些特性,可以利用它来解决竞态问题。
往后其他同步机制都是在原子操作的基础上进行扩展的。
原子操作有整型原子操作、64位原子操作以及位原子操作。
1 整型原子操作(Atomic Integer Operations)
要使用原子操作,需要定义一个原子变量,然后使用内核提供的接口对其进行原子操作。
整型原子变量结构如下
-
#include
-
typedef struct {
-
int counter;
-
} atomic_t;
可以看出整型原子变量实质上是一个32位整型变量。
整型原子变量操作接口,其实现方式与具体的架构有关。
-
#include
-
ATOMIC_INIT(int i) // 定义原子变量时,将其值赋为i
-
int atomic_read(atomic_t *v) // 读v的值
-
void atomic_set(atomic_t *v, int i) // 设置v的值为i
-
void atomic_add(int i, atomic *v) // v的值增加i
-
void atomic_sub(int i, atomic *v) // v的值减少i
-
void atomic_inc(atomic *v) // v的值加1
-
void atomic_dec(atomic *v) // v的值减1
-
int atomic_sub_and_test(int i, atomic_t *v) // v的值减少i,且结果为0时返回true
-
int atomic_add_negative(int i, atomic_t *v) // v的值增加i,且结果为负数时返回true
-
int atomic_add_return(int i, atomic_t *v) // v的值增加i,且返回结果
-
int atomic_sub_return(int i, atomic_t *v) // v的值减少i,且返回结果
-
int atomic_inc_return(atomic_t *v) // v的值加1,且返回结果
-
int atomic_dec_return(atomic_t *v) // v的值减1,且返回结果
-
int atomic_dec_and_test(atomic_t *v) // v的值减1,且结果为0时返回true
-
int atomic_inc_and_test(atomic_t *v) // v的值加1,且结果为0时返回true
2 64位原子操作(64-Bit Atomic Operations)
64位原子变量结构
-
typedef struct {
-
u64 __aligned(8) counter;
-
} atomic64_t;
64位原子变量操作接口与整型变量操作接口类似,只要将整型变量接口名称的"atomic"改成"atomic64"即可。
3 位原子操作(Atomic Bitwise Operations)
位原子操作接口
-
#include <asm/bitops.h>
-
void set_bit(int nr, void *addr) // 将addr第nr位置1
-
void clear_bit(int nr, void *addr) // 将addr第nr位置0
-
void change_bit(int nr, void *addr) // 将addr第nr位值取反
-
int test_and_set_bit(int nr, void *addr) // 将addr第nr位置1,并将该位之前值返回
-
int test_and_clear_bit(int nr, void *addr) // 将addr第nr位置0,并将该位之前值返回
-
int test_and_change_bit(int nr, void *addr)// 将addr第nr位取反,并将该位之前值返回
-
int test_bit(int nr, void *addr) // 将addr第nr位的值返回
阅读(5514) | 评论(1) | 转发(0) |