atomic_inc 原子操作

转载 2015年07月10日 11:32:54
atomic_inc(&v)对变量v用锁定总线的单指令进行不可分解的"原子"级增量操作,避免v的值由于中断或多处理器同时操作造成不确定状态。
原子操作
  所谓原子操作,就是该操作绝不会在执行完毕前被任何其他任务或事件打断,也就说,它的最小的执行单位,不可能有比它更小的执行单位,因此这里的原子实际是使用了物理学里的物质微粒的概念。
  原子操作需要硬件的支持,因此是架构相关的,其API和原子类型的定义都定义在内核源码树的include/asm/atomic.h文件中,它们都使用汇编语言实现,因为C语言并不能实现这样的操作。

  原子操作主要用于实现资源计数,很多引用计数(refcnt)就是通过原子操作实现的。原子类型定义如下:      

     typedef struct { volatile int counter; } atomic_t;

  volatile修饰字段告诉gcc不要对该类型的数据做优化处理,对它的访问都是对内存的访问,而不是对寄存器的访问。 
  原子操作API包括: atomic_read(atomic_t * v);
  该函数对原子类型的变量进行原子读操作,它返回原子类型的变量v的值。 
       atomic_set(atomic_t * v, int i);
  该函数设置原子类型的变量v的值为i。 
       void atomic_add(int i, atomic_t *v);
  该函数给原子类型的变量v增加值i。 
        atomic_sub(int i, atomic_t *v);
  该函数从原子类型的变量v中减去i。 
       int atomic_sub_and_test(int i, atomic_t *v);
  该函数从原子类型的变量v中减去i,并判断结果是否为0,如果为0,返回真,否则返回假。 
       void atomic_inc(atomic_t *v);
  该函数对原子类型变量v原子地增加1。 
        void atomic_dec(atomic_t *v);
  该函数对原子类型的变量v原子地减1。
       int atomic_dec_and_test(atomic_t *v);
  该函数对原子类型的变量v原子地减1,并判断结果是否为0,如果为0,返回真,否则返回假。 
        int atomic_inc_and_test(atomic_t *v);
  该函数对原子类型的变量v原子地增加1,并判断结果是否为0,如果为0,返回真,否则返回假。 
        int atomic_add_negative(int i, atomic_t *v);
  该函数对原子类型的变量v原子地增加I,并判断结果是否为负数,如果是,返回真,否则返回假。 
       int atomic_add_return(int i, atomic_t *v);
  该函数对原子类型的变量v原子地增加i,并且返回指向v的指针。 
       int atomic_sub_return(int i, atomic_t *v);
  该函数从原子类型的变量v中减去i,并且返回指向v的指针。 
       int atomic_inc_return(atomic_t * v);
  该函数对原子类型的变量v原子地增加1并且返回指向v的指针。 
        int atomic_dec_return(atomic_t * v);
  该函数对原子类型的变量v原子地减1并且返回指向v的指针。 
  原子操作通常用于实现资源的引用计数,在TCP/IP协议栈的IP碎片处理中,就使用了引用计数,碎片队列结构struct ipq描述了一个IP碎片,字段refcnt就是引用计数器,它的类型为atomic_t,当创建IP碎片时(在函数ip_frag_create中),使用atomic_set函数把它设置为1,当引用该IP碎片时,就使用函数atomic_inc把引用计数加1。 
  当不需要引用该IP碎片时,就使用函数ipq_put来释放该IP碎片,ipq_put使用函数atomic_dec_and_test把引用计数减1并判断引用计数是否为0,如果是就释放IP碎片。函数ipq_kill把IP碎片从ipq队列中删除,并把该删除的IP碎片的引用计数减1(通过使用函数atomic_dec实现)。

原子操作(atomic operation)

深入分析Volatile的实现原理 引言 在多线程并发编程中synchronized和Volatile都扮演着重要的角色,Volatile是轻量级的synchronized,它在多处理...
  • holandstone
  • holandstone
  • 2013年02月21日 09:53
  • 16059

atomic_inc 原子操作

atomic_inc(&v)对变量v用锁定总线的单指令进行不可分解的"原子"级增量操作,避免v的值由于中断或多处理器同时操作造成不确定状态。 原子操作   所谓原子操作,就是该操作绝不...
  • haifeilang
  • haifeilang
  • 2013年07月19日 14:09
  • 364

atomic_inc 原子操作

atomic_inc(&v)对变量v用锁定总线的单指令进行不可分解的"原子"级增量操作,避免v的值由于中断或多处理器同时操作造成不确定状态。 原子操作   所谓原子操作,就是该操作...
  • duxingxia356
  • duxingxia356
  • 2015年07月06日 16:42
  • 262

atomic_inc 原子操作

atomic_inc(&v)对变量v用锁定总线的单指令进行不可分解的"原子"级增量操作,避免v的值由于中断或多处理器同时操作造成不确定状态。 原子操作   所谓原子操作,就是该操作...
  • King_BingGe
  • King_BingGe
  • 2013年11月18日 14:52
  • 1056

atomic_inc 原子操作

http://blog.chinaunix.net/uid-10747583-id-2920900.html atomic_inc 原子操作 2011-09-27 19:17:42 分类:...
  • stoneyyhit
  • stoneyyhit
  • 2015年05月05日 16:00
  • 148

Java并发编程系列之十九:原子操作类

原子操作类简介当更新一个变量的时候,多出现数据争用的时候可能出现所意想不到的情况。这时的一般策略是使用synchronized解决,因为synchronized能够保证多个线程不会同时更新该变量。然而...
  • u011116672
  • u011116672
  • 2016年04月05日 22:22
  • 7570

Linux内核的原子操作

1、基本概念 原子操作可以保证指令以原子的方式执行,执行过程不被打断。它通过把读取和修改变量的行为包含在一个单步中执行,从而防止了竞争的发生,保证操作结果总是一致的。 例如: int...
  • kobejayandy
  • kobejayandy
  • 2014年07月17日 00:21
  • 1737

Windows API 原子操作

现代操作系统中,一般都提供了原子操作来实现一些同步操作,所谓原子操作,也就是一个独立而不可分割的操作。在单核环境中,一般的意义下原子操作中线程不会被切换,线程切换要么在原子操作之前,要么在原子操作完成...
  • shun01
  • shun01
  • 2013年09月22日 20:25
  • 2699

锁(一) 中断屏蔽 原子操作

中断屏蔽 单cpu,在单cpu范围内避免竞态的简单方法是在进入临界区之前屏蔽系统的中断。cpu一般都具备屏蔽中断和打开中断 的功能,这项功能可以保证正在执行的内核执行路径不被中断处理程序抢占,防止某些...
  • MEIYOUDAO_JIUSHIDAO
  • MEIYOUDAO_JIUSHIDAO
  • 2017年04月27日 10:38
  • 304

原子操作的实现原理

1. 引言 原子(atom)本意是“不能被进一步分割的最小粒子”,而原子操作(atomic operation)意为"不可被中断的一个或一系列操作" 。在多处理器上实现原子操作就变得有点复杂。本文让我...
  • ccfeng2008
  • ccfeng2008
  • 2015年10月24日 22:36
  • 3058
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:atomic_inc 原子操作
举报原因:
原因补充:

(最多只允许输入30个字)