原子操作仅执行一次,在执行过程中不会中断也不会休眠;是最小的执行单元;鉴于原子操作这些特性,可以利用它来解决竞态问题。
往后其他同步机制都是在原子操作的基础上进行扩展的。
原子操作有整型原子操作、64位原子操作以及位原子操作。
1 整型原子操作(Atomic Integer Operations)
要使用原子操作,需要定义一个原子变量,然后使用内核提供的接口对其进行原子操作。
整型原子变量结构如下
- #include <linux/type.h>
- typedef struct {
- int counter;
- } atomic_t;
整型原子变量操作接口,其实现方式与具体的架构有关。
- #include <asm/atomic.h>
- 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;
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位的值返回