linux系统原子操作

一、概念

原子操作提供了指令原子执行,中间没有中断。就像原子被认为是不可分割颗粒一样,原子操作(atomic operation)是不可分割的操作。
      c语言中一个变量的自加1操作,看起来很简单,好像只需要一条指令而不被打断。但这个操作实现起来,CPU的执行是有一个过程的,分为读取到寄存器,寄存器数学运算,回写到内存。这个实际情况,会给我们程序编写时带来隐患,举例来说明。

Thread 1                  Thread 2
      ---------------------------------------------
      get i (7)                 get i (7)

increment i (7->8)

---                      increment i (7->8)

write back i (8)          ----

---                          write back i (8)

可以看到,不通的进程对同一个变量,自加1操作了两次,但是得到的结果,却是只自加1了一次,这种结果不是我们预先想要的。如果有一种方法,让对这个变量的读取、计算、回写整个过程,不被别的进程所打断,那么情况会好很多:

Thread 1                            Thread 2
      --------------------------------------------------------
      get, increment, and store i(7->8)        ---

---                                 get, increment, and store i(8->9)

或者:

Thread 1                            Thread 2
      --------------------------------------------------------
      ---                                  get, increment, and store i(7->8)        
      get, increment, and store i(8->9)          ---

这种操作就是原子操作,利用一种独占内存的实现策略,这当然需要CPU的指令集提供这样的锁内存单元操作。

二、使用方法

1、定义一个原子变量,并初始化

atomic_t v = ATOMIC_INIT(0);

2、原子变量自减1

atomic_dec(&v);

3、原子变量自加1

atomic_inc(&v);

4、读取原子变量的值

atomic_read(&v);

5、原子变量自减1,并与0比较,如果为0则返回true,否则返回false

atomic_dec_and_test(&v);

参考资料:linux中原子操作实现方式

时间: 2024-07-29 04:47:33

linux系统原子操作的相关文章

Linux系统开发 3 文件系统开发 文件/目录

[本文谢绝转载,原文来自http://990487026.blog.51cto.com] Linux系统开发 文件操作 ext2文件系统了解 stat()函数 access()函数 chmod()函数 utime()函数 truncate()函数 link()硬链接函数 symlink()软链接函数 readlink()函数 unlink函数 rename函数() 目录操作 chdir()/fchdir() getcwd/getwd()/get_current_dir_name() pathco

嵌入式 Linux系统编程(一)——文件IO

嵌入式 Linux系统编程(一)--文件IO 一.文件IO概念 linux文件IO操作有两套大类的操作方式:不带缓存的文件IO操作,带缓存的文件IO操作.不带缓存的属于直接调用系统调用(system call)的方式,高效完成文件输入输出.它以文件标识符(整型)作为文件唯一性的判断依据.这种操作不是ASCI标准的,与系统有关,移植有一定的问题.而带缓存的是在不带缓存的基础之上封装了一层,维护了一个输入输出缓冲区,使之能跨OS,成为ASCI标准,称为标准IO库.不带缓存的方式频繁进行用户态 和内核

Linux 系统应用编程——进程间通信(下)

在前面,我们学习了传统的进程间通信方式--无名管道(pipe).有名管道(fifo)和信号(signal). 下面我们来学习 System V  IPC 对象: 1.共享内存(share memory): 2.信号灯(semaohore): 3.消息队列(message queue):        IPC对象是活动在内核级别的一种进程间通信的工具.存在的IPC对象通过它的标识符来引用和访问,这个标识符是一个非负整数,它唯一的标识了一个IPC对象,这个IPC对象可以是消息队列或信号量或共享存储器

Linux系统编程(第2版)笔记 (本书基本上就是Linux C API的简单使用说明,入门级别的)

Linux系统编程(第2版) 跳转至: 导航. 搜索 目录 1 入门和基本概念 2 文件I/O 3 缓冲I/O 4 高级文件I/O 5 进程管理 6 高级进程管理 7 线程 8 文件和目录管理 9 内存管理 10 信号 11 时间(这里谈不上系统编程了,就是C库API) 12 附录A C语言的GCC扩展 13 附录B 参考书目 入门和基本概念 文件I/O read(): EINTR EAGAIN 其他错误:EBADF EFAULT EINVAL EIO Append模式:每次write之前的文件

查看Linux系统版本信息

一.查看Linux内核版本命令(两种方法): 1.cat /proc/version [[email protected]CentOS home]# cat /proc/versionLinux version 2.6.32-431.el6.x86_64 ([email protected]) (gcc version 4.4.7 20120313 (Red Hat 4.4.7-4) (GCC) ) #1 SMP Fri Nov 22 03:15:09 UTC 2013 2.uname -a [

制作SD(8G)卡Linux镜像,使得ZC706开发板可以从SD卡启动进入Linux系统

转自网络,供学习记录使用,红色部分是我实验时,这篇文章和网站稍有出入的地方. 目的:制作SD(8G)卡Linux镜像,使得ZC706开发板可以从SD卡启动进入Linux系统 在http://wiki.analog.com/resources/eval/user-guides/ad-fmcomms2-ebz/quickstart/zynq(姑且把这个链接成为链接1吧)链接中找到 图1 点击绿色字体的链接,下载镜像原始文件.这里有不同时期的版本,本说明中选择 图2 下载的原始文件为:2014_R2-

Linux系统基础.作业

要求以root用户登录系统,右击桌面打开终端,查看当前登陆Linux系统所使用的用户名 查看哪些用户在系统上工作 修改当前时间为2018年8月26号11:28 查看2015年10月份日历 使用两种方法查看ls命令的使用说明 清除屏幕 ctrl+L 使用"useradd tom"命令新建tom用户,为tom用户设置密码"123" 切换当前用户为tom 查看当前登陆Linux系统所使用的用户名

小白文科生眼中的Linux系统

我是一个正统的文科生,基本上在win的基础上长大,最开始接触的是Windows98(95虽然知道,但那时候太小了)然后是me,2000,再到XP,然后是vista,再然后就是使用量最大的7,然后是8,8.1,10,...基本上每个版本都用(玩)过,对win也可以说是有了基础的了解,13年暑假的时候,Android迅速崛起,从那个时候,刚刚知道Linux.在然后就开始疯狂的搜索Linux 的资料,那时候刚刚高中毕业,网上的资料基本都看不懂,虽然看不懂但还是找的津津有味. 记得2013年最先开始了解

老男孩教育每日一题-2017年5月11-基础知识点: linux系统中监听端口概念是什么?

1.题目 老男孩教育每日一题-2017年5月11-基础知识点:linux系统中监听端口概念是什么? 2.参考答案 监听端口的概念涉及到网络概念与TCP状态集转化概念,可能比较复杂不便理解,可以按照下图简单进行理解? 将整个服务器操作系统比喻作为一个别墅 服务器上的每一个网卡比作是别墅中每间房间 服务器网卡上配置的IP地址比喻作为房间中每个人 而房间里面人的耳朵就好比是监听的端口 当默认采用监听0.0.0.0地址时,表示房间中的每个人都竖起耳朵等待别墅外面的人呼唤当别墅外面的用户向房间1的人呼喊时