Chinaunix首页 | 论坛 | 博客
  • 博客访问: 694029
  • 博文数量: 90
  • 博客积分: 3225
  • 博客等级: 少校
  • 技术积分: 1200
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-20 11:04
个人简介

菩提本无树,明镜变非台 本来无一物,何处惹尘埃

文章分类

全部博文(90)

文章存档

2015年(1)

2014年(12)

2013年(15)

2012年(31)

2011年(8)

2010年(23)

分类: LINUX

2012-07-02 18:54:04

 原子操作仅执行一次,在执行过程中不会中断也不会休眠;是最小的执行单元;鉴于原子操作这些特性,可以利用它来解决竞态问题。
 往后其他同步机制都是在原子操作的基础上进行扩展的。
 原子操作有整型原子操作、64位原子操作以及位原子操作。

1 整型原子操作
(Atomic Integer Operations)
 要使用原子操作,需要定义一个原子变量,然后使用内核提供的接口对其进行原子操作。
 整型原子变量结构如下
  1. #include
  2. typedef struct {
  3.     int counter;
  4. } atomic_t;
  可以看出整型原子变量实质上是一个32位整型变量。
 整型原子变量操作接口,其实现方式与具体的架构有关。
  1. #include
  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位的值返回

阅读(5429) | 评论(1) | 转发(0) |
0

上一篇:并发与竞态

下一篇:物联网五大核心技术

给主人留下些什么吧!~~

wd_20142014-12-23 14:57:23

推荐文章:[url=http://cjjjs.cn/windows/12342320121020.aspx]原子操作与互斥访问关系分析 [/url]
推荐理由:主要讲解原子操作的原理和实现过程,借鉴了数据库系统的事务来分析。