原子操作函数原型

 原子操作仅执行一次,在执行过程中不会中断也不会休眠;是最小的执行单元;鉴于原子操作这些特性,可以利用它来解决竞态问题。

 往后其他同步机制都是在原子操作的基础上进行扩展的。
 原子操作有整型原子操作、64位原子操作以及位原子操作。

1 整型原子操作
(Atomic Integer Operations)
 要使用原子操作,需要定义一个原子变量,然后使用内核提供的接口对其进行原子操作。
 整型原子变量结构如下

  1. #include <linux/type.h>
  2. typedef struct {
  3.     int counter;
  4. } atomic_t;
  可以看出整型原子变量实质上是一个32位整型变量。
 整型原子变量操作接口,其实现方式与具体的架构有关。
  1. #include <asm/atomic.h>
  2. ATOMIC_INIT(int i)                           // 定义原子变量时,将其值赋为i
  3. int atomic_read(atomic_t *v)                 // 读v的值
  4. void atomic_set(atomic_t *v, int i)          // 设置v的值为i
  5. void atomic_add(int i, atomic *v)            // v的值增加i
  6. void atomic_sub(int i, atomic *v)            // v的值减少i
  7. void atomic_inc(atomic *v)                   // v的值加1
  8. void atomic_dec(atomic *v)                   // v的值减1
  9. int atomic_sub_and_test(int i, atomic_t *v)  // v的值减少i,且结果为0时返回true
  10. int atomic_add_negative(int i, atomic_t *v)  // v的值增加i,且结果为负数时返回true
  11. int atomic_add_return(int i, atomic_t *v)    // v的值增加i,且返回结果
  12. int atomic_sub_return(int i, atomic_t *v)    // v的值减少i,且返回结果
  13. int atomic_inc_return(atomic_t *v)           // v的值加1,且返回结果
  14. int atomic_dec_return(atomic_t *v)           // v的值减1,且返回结果
  15. int atomic_dec_and_test(atomic_t *v)         // v的值减1,且结果为0时返回true
  16. int atomic_inc_and_test(atomic_t *v)         // v的值加1,且结果为0时返回true

2 64位原子操作 (64-Bit Atomic Operations)
 64位原子变量结构
  1. typedef struct {
  2.     u64 __aligned(8) counter;
  3. } atomic64_t;
  64位原子变量操作接口与整型变量操作接口类似,只要将整型变量接口名称的"atomic"改成"atomic64"即可。

3 位原子操作 (Atomic Bitwise Operations)
 位原子操作接口
  1. #include <asm/bitops.h>
  2. void set_bit(int nr, void *addr)           // 将addr第nr位置1
  3. void clear_bit(int nr, void *addr)         // 将addr第nr位置0
  4. void change_bit(int nr, void *addr)        // 将addr第nr位值取反
  5. int test_and_set_bit(int nr, void *addr)   // 将addr第nr位置1,并将该位之前值返回
  6. int test_and_clear_bit(int nr, void *addr) // 将addr第nr位置0,并将该位之前值返回
  7. int test_and_change_bit(int nr, void *addr)// 将addr第nr位取反,并将该位之前值返回
  8. int test_bit(int nr, void *addr)           // 将addr第nr位的值返回

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值