内核为原子操作提供了两组接口。一组操作整数,一个组操作比特位。

1.整数原子操作

数据类型为:

typedefstruct {

volatileint counter;

}atomic_t;

为了保持内核在各个平台兼容,以前规定atomic_t的值不能超过24位(都是SPARC惹的祸),不过现在该规定已经不需要了。

相关操作如下:

voidatomic_set(atomic_t *v, int i);

atomic_tv = ATOMIC_INIT(0);//设置原子变量v的值为整数i。

intatomic_read(atomic_t *v);//返回原子变量当前的值

voidatomic_add(int i, atomic_t *v);//将i加到原子变量上

voidatomic_sub(int i, atomic_t *v)//从原子变量的值中减去i

voidatomic_inc(atomic_t *v);//增加原子变量的值

voidatomic_dec(atomic_t *v);//减少原子变量的值

执行相关的操作后测试原子变量的值是否为0

Performthe specified operation and test the result; if, after the operation,the atomic value is 0, then the return value is true; otherwise, itis false. Note that there is no atomic_add_and_test.

intatomic_inc_and_test(atomic_t *v);

intatomic_dec_and_test(atomic_t *v);

intatomic_sub_and_test(int i, atomic_t *v);

Addthe integer variable i to v. The return value is true if the resultis negative,false otherwise.

intatomic_add_negative(int i, atomic_t *v);

Behavejust like atomic_add and friends, with the exception that they returnthe new value of the atomic variable to the caller.

intatomic_add_return(int i, atomic_t *v);

intatomic_sub_return(int i, atomic_t *v);

intatomic_inc_return(atomic_t *v);

intatomic_dec_return(atomic_t *v);

最近的内核也提供了64位的版本,即atomic64_t,方法和用法与32位类似,方法名相应的地方换为atomic64。

2.位操作

Setsbit number nr in the data item pointed to by addr.

voidset_bit(nr, void *addr);

Clearsthe specified bit in the unsigned long datum that lives at addr. Itssemantics are otherwise the same as set_bit.

voidclear_bit(nr, void *addr);

voidchange_bit(nr, void *addr); // Toggles the bit.

Thisfunction is the only bit operation that doesn’t need to be atomic;it simply returns the current value of the bit.

test_bit(nr,void *addr);

Behaveatomically like those listed previously, except that they also returnthe previous value of the bit.

inttest_and_set_bit(nr, void *addr);

inttest_and_clear_bit(nr, void *addr);

inttest_and_change_bit(nr, void *addr);

使用场景:

/*try to set lock */

while(test_and_set_bit(nr, addr) != 0)

wait_for_a_while();

/*do your work */

/*release lock, and check... */

if(test_and_clear_bit(nr, addr) = = 0)

something_went_wrong(); /* already released: error */

内核也提供了一套非原子位操作函数,函数名就是原子版函数前面加两下划线。

转载于:https://my.oschina.net/fuyajun1983cn/blog/263801

内核同步机制——原子操作相关推荐

  1. Linux内核同步机制之(四):spin lock【转】

    转自:http://www.wowotech.net/kernel_synchronization/spinlock.html 一.前言 在linux kernel的实现中,经常会遇到这样的场景:共享 ...

  2. linux 内核同步--理解原子操作、自旋锁、信号量(可睡眠)、读写锁、RCU锁、PER_CPU变量、内存屏障

    内核同步 内核中可能造成并发的原因: 中断–中断几乎可以在任何时刻异步发生,也就可以随时打断当前正在执行的代码. 软中断和tasklet–内核能在任何时刻唤醒或调度软中断和tasklet,打断当前正在 ...

  3. 内核同步机制-RCU同步机制

    转自http://www.360doc.com/content/09/0805/00/36491_4675691.shtml 目录 [隐藏] 1 RCU同步机制 1.1 RCU介绍 1.2 RCU A ...

  4. 内核同步机制之Mutex Exclusion

    为什么80%的码农都做不了架构师?>>>    S3C2440在内核版本2.6.34下开发ADC驱动时,会发现驱动程序里用了互斥通信来实现同步: <!-- lang: cpp ...

  5. Linux内核同步机制之信号量与锁

    Linux内核同步控制方法有很多,信号量.锁.原子量.RCU等等,不同的实现方法应用于不同的环境来提高操作系统效率.首先,看看我们最熟悉的两种机制--信号量.锁. 一.信号量 首先还是看看内核中是怎么 ...

  6. 内核同步机制-优化屏障和内存屏障

    优化屏障 编译器编译源代码时,会将源代码进行优化,将源代码的指令进行重排序,以适合于CPU的并行执行.然而,内核同步必须避免指令重新排序,优化屏障(Optimization barrier)避免编译器 ...

  7. Linux内核同步机制之(一):原子操作

    作者: 郭健 来源: wowotech 一.源由 我们的程序逻辑经常遇到这样的操作序列: 1.读一个位于memory中的变量的值到寄存器中 2.修改该变量的值(也就是修改寄存器中的值) 3.将寄存器中 ...

  8. Linux内核同步机制之completion

    内核编程中常见的一种模式是,在当前线程之外初始化某个活动,然后等待该活动的结束.这个活动可能是,创建一个新的内核线程或者新的用户空间进程.对一个已有进程的某个请求,或者某种类型的硬件动作,等等.在这种 ...

  9. 内核同步机制-信号量(semaphore)

    三.内核信号量(semaphore) Linux的信号量是一种睡眠锁,这个不同于自旋锁.如果有一个任务试图获得一个已经被占用的信号量时,信号量会将其推进一个等待队列(具体可以参考进程的活动状态),然后 ...

最新文章

  1. 几十年的领域专家告诉你,机器翻译进化到哪一步了?
  2. SUMO 设置车辆的换道模型
  3. C 库函数 - vprintf()
  4. Bigtable数据模型和架构
  5. android webview设置加载进度条
  6. android 下载多个文件怎么打开,从android的下拉框中下载多个文件或文件夹?
  7. 软件构架师之路[转帖]
  8. csv文件的使用,csv空白行问题
  9. 拓端tecdat|Excel 实例:数据进行排序和筛选
  10. STM32F030 电压监测实现
  11. 单循环赛制php,年度总决赛个人PK循环赛赛制解读
  12. git入门-----初始化命令(init、clone),Basic Snapshotting(add、status、commit、diff、reset、stash)
  13. 学习CALCULATE函数(六)丨帕累托之累计求和
  14. Aandroid最简单最全面的热修复
  15. 搞笑小品剧本-- 搞笑《英雄》——气晕张艺谋
  16. JavaScript ES5-ES6详解
  17. 如何开发一个个人微信小程序,微信小程序开发入门教程
  18. python读取xlsx文件中的日期
  19. 小破练习-嵌套循环及列表
  20. 如何使用Docker发布SpringBoot项目

热门文章

  1. VMware 主机基板管理控制器的状态
  2. mariadb编译安装流程
  3. docker容器互联实战
  4. hdu 5751 Eades
  5. 提取网页中的链接并生成xml
  6. Xmodem恢复交换机IOS
  7. 技术感悟--回顾2012
  8. skyline B/S模式下脚本实现输出视频
  9. 怎样解决MySQL数据库主从复制延迟的问题
  10. sitemesh排除装饰action的心得