何为原子操作?以前认为原子是组成物质的最小单位,是不可分割的。因此就利用原子这个词,表示某个操作也是原子的,不可分割的,不能被打断,这就是原子操作。原子操作又分为整型原子操作 和 位原子操作。如果我们想使用原子操作,linux的内核都给我们做好了,我们只需要搞定原理然后去用就好了。linux 的原子操作都依赖底层的CPU的原子操作来实现,所以和CPU架构密切相关。原子操作在不同体系架构实现的方法不同,基本采用汇编实现,我们一般所说的操作都是针对32位的ARM的。
  整型原子操作接口

1,设置原子的值
void atomic_set(atomic_t *v,int i);    //设置原子变量v的值为i
atomic_t v = ATOMIC_INIT(0);           //定义原子变量v,并初始化为0;
2 获取原子变量的值
/*原子的读取atomic_t变量的值,v是这个变量的地址\返回原子变量v的值;
*/
atomic_read(atomic_t* v);       3 原子变量的加、减
void atomic_add(int i, atomic_t* v);   //原子变量v增加i;
void atomic_sub(int i, atomic_t* v);   //原子变量v减少i;4 原子变量的自增和自减
void atomic_inc(atomic_t* v);          //原子变量增加1;
void atomic_dec(atomic_t* v);          //原子变量减少1;5 操作并检测
//先自增1,然后测试其值是否为0,若为0,则返回true,否则返回false;
int atomic_inc_and_test(atomic_t* v);
int atomic_dec_and_test(atomic_t* v);
//先减i,然后测试其值是否为0,若为0,则返回true,否则返回false;
int atomic_sub_and_test(int i, atomic_t* v);
注意:只有自加,没有加操作6 操作并返回
//v的值加i后返回新的值;
int atomic_add_return(int i, atomic_t* v);
int atomic_sub_return(int i, atomic_t* v);
//v的值自增1后返回新的值;
int atomic_inc_return(atomic_t* v);
int atomic_dec_return(atomic_t* v);    

  位原子操作接口

1 设置位
void set_bit(int nr, volatile void* addr);        //设置地址addr的第nr位,所谓设置位,就是把位写为1;2 清除位
void clear_bit(int nr, volatile void* addr);      //清除地址addr的第nr位,所谓清除位,就是把位写为0;3 改变位
void change_bit(int nr, volatile void* addr);     //把地址addr的第nr位反转;4 测试位
int test_bit(int nr, volatile void* addr);    //返回地址addr的第nr位;5 测试并操作位
int test_and_set_bit(int nr, volatile void* addr);    //测试并设置位;若addr的第nr位非0,则返回true; 若addr的第nr位为0,则返回false;
int test_and_clear_bit(int nr, volatile void* addr);    //测试并清除位;
int test_and_change_bit(int nr, volatile void* addr);    //测试并反转位;
上述操作等同于先执行test_bit(nr,voidaddr)然后在执行xxx_bit(nr,voidaddr)

  原子操作多用于多线程的竟态,使设备只能被一个进程打开。

 //定义原子变量并初始化为1
static atomic_t atomic_available = ATOMIC_INIT(1);     int led_open(struct inode *inode, struct file *filp)  {  /*如果没有进程在使用该驱动 ,原子变量值 为 1 ,将原子变量减 一 为 0 ,函数返回 true ,再 !true 为 假 ,if里面的代码不执行,继续执行下下面的程序。*/if(!atomic_dec_and_test(&atomic_available)) {  /* 如果再有进程来打开驱动程序,0-1 = 负1,返回 false ,if 条件成立,运行里面的代码,将原子变量加一恢复到0,程序返回*/printk(KERN_ERR "already open!\n");  atomic_inc(&atomic_available);  return -EBUSY;  //already open   }  printk(KERN_INFO "led open!\n");  filp->private_data = atomic_available;   return 0;  }  int led_release(struct inode *inode ,struct file *filp)  {  printk(KERN_INFO "led release!\n");  /*推出时恢复为1 */atomic_inc(&atomic_available);  return 0;  }  

我们可以写个程序进行测试

int main()
{  int fd;  fd = open("/dev/leds",O_RDWR);  if(fd == -1) {  printf("open error!!\n");  return -1;  }  sleep(10);  printf("close fd!\n");  close(fd);  return 0;
} 

  我们先打开led设备,然后延时10s之后再关闭。我们可以刚打开10s之内,使用cat /dev/leds ,发现还是可以打开的。如果使用了原子操作我们在去测试,发现打印出设备正在忙,证明我们的原子操作起作用了。

linux-原子操作相关推荐

  1. linux 外部协议请求,ARM架构和总线协议如何支持Linux原子操作?

    这篇文章探讨ARM架构和总线协议如何来支持的.对于某款ARM处理器和总线CCI,CCN和CMN产品的具体实现,属于实现层面的微架构,一般需要NDA,这里不予讨论. 顺便提一下,在ARMv8 架构下对应 ...

  2. int linux 原子操作_linux 原子操作

    原子操作 原子操作,顾名思义,就是说像原子一样不可再细分不可被中途打断.一个操作是原子操作,意思就是说这个操作是以原子的方式被执行,要一口气执行完,执行过程不能够被OS的其他行为打断,是一个整体的过程 ...

  3. int linux 原子操作_linux c++编程之多线程:原子操作如何解决线程冲突

    在多线程中操作全局变量一般都会引起线程冲突,为了解决线程冲突,引入原子操作. 1.线程冲突 #include #include #include #include int g_count = 0;vo ...

  4. int linux 原子操作_Linux原子操作

    一.原子操作 所谓原子操作,就是该操作绝不会在执行完毕前被任何其他任务或事件打断,也就说,它是最小的执行单位,不可能有比它更小的执行单位,因此这里的原子实际是使用了物理学里的物质微粒的概念. 原子操作 ...

  5. 原子操作 - linux内核锁(一)

    "原子"是不可分割的意思,原子操作是指一个实际运行的操作不可分割,这个运行必然会被执行并完成而不会被另外一个任务或者事件打断.也就说,它是最小的执行单位,不可能有比它更小的执行单位 ...

  6. handler原子锁_Linux的原子操作与同步机制

    Linux的原子操作与同步机制 并发问题 现代操作系统支持多任务的并发,并发在提高计算资源利用率的同时也带来了资源竞争的问题.例如C语言语句"count++;"在未经编译器优化时生 ...

  7. 给大家推荐一个优质Linux内核技术公众号-Linux阅码场

    作为一个Linux 技术公众号的作者,我觉得有义务推荐优秀的公众号,推广内容,希望对大家的学习有所帮助~ Linux阅码场是一个专注Linux内核和系统编程与调试调优技术的公众号,它的文章云集了国内众 ...

  8. 原子操作(atomic operation)

    深入分析Volatile的实现原理 引言 在多线程并发编程中synchronized和Volatile都扮演着重要的角色,Volatile是轻量级的synchronized,它在多处理器开发中保证了共 ...

  9. 将 Linux 移植到 M1 Mac 真的太难了!

    ????????关注后回复 "进群" ,拉你进程序员交流群???????? [CSDN 编者按]自去年苹果自研 M1 芯片发布之后,激发了无数用户的体验热情,与此同时,也吸引大批开 ...

  10. 并发之volatile底层原理

    15.深入分析Volatile的实现原理 14.java多线程编程底层原理剖析以及volatile原理 13.Java中Volatile底层原理与应用 12.Java多线程-java.util.con ...

最新文章

  1. 使用matlab做可重复性实验结果——rng
  2. android studio差异化,productFlavors + buildTypes + signingConfigs 构建差异化 Android 应用
  3. python web开发项目 源码_真零基础Python开发web
  4. kibana操作elasticsearch:新增数据(自定义id)
  5. mpvue还在维护吗_mpvue 微信小程序开发之生命周期
  6. [学习笔记]批次需求计划系统-简要
  7. 安装oracle不动了,windows2008安装ORACLE到2%不动的问题 | 信春哥,系统稳,闭眼上线不回滚!...
  8. 听云数据库管理平台NetopGO简介
  9. 【Python系列】之判断字符是否为数字
  10. C#获取屏幕大小或任务栏大小
  11. 安卓手机反应慢又卡怎么办_安卓手机出现卡顿反应慢的具体处理方法
  12. 《敏捷软件开发》— 敏捷开发 — 敏捷实践
  13. WIndows编译MAME0.184
  14. 树莓派4B监控CPU占用率、内存使用率、磁盘使用量以及CPU温度
  15. 没有产权证的车库能不能随时拆掉
  16. php guzzle的基本使用
  17. 98岁国学大师自曝只喜欢18岁的年轻美女
  18. 关于Java基础部分知识的综合应用之成员调度系统的项目
  19. 如何做好aso关键词优化提升关键词排名
  20. FDTD Solutions-边界条件

热门文章

  1. JUnit单元测试案例——异常测试(测试语言Java)
  2. 泛微E9表单建模查询列表批量文件下载
  3. ocr手机号识别应用
  4. signature微信_寻找Microsoft Signature Edition PC? 这是该怎么做
  5. 图的建立(邻接矩阵)与其深度优先和广度优先遍历
  6. swift3 语法摘要
  7. 航电oj-2025 查找最大元素
  8. 云计算与大数据之间的紧密联系
  9. 查看Ubuntu系统硬件配置命令
  10. 大疆无人机android登录闪退,你的DJI APP闪退了吗?附官方解决方案