一、原子操作(atomic)
所谓原子操作,就是该操作绝不会在执行完毕前被任何其他任务或事件打断,也就说,它的最小的执行单位,不可能有比它更小的执行单位,因此这里的原子实际
是使用了物理学里的物质微粒的概念。
原子操作需要硬件的支持,因此是架构相关的,其API和原子类型的定义都定义在内核源码树的include/asm/atomic.h文件中,它们都使用汇编语言实现,因为C语
言并不能实现这样的操作。
原子操作主要用于实现资源计数,很多引用计数(refcnt)就是通过原子操作实现的。原子类型定义如下:<Linux/types.h>
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的指针。
分享到:
相关推荐
linux下原子操作程序源码
第一篇: Ubuntu 操作系统入门 本篇主要讲解 Ubuntu 操作系统的使用,本篇不涉及到任何嵌入式方面的知识,全部是在 PC 上完成的,只要安装好 Ubuntu 操作系统即可。 第二篇: ARM 裸机开发 从本篇开始我们就正式...
通常情况下原子操作可以通过互斥的访问方式来保证,例如Linux下的互斥锁(mutex),Windows下的临界区(Critical Section)等。下面看一个Linux环境使用POSIX标准的pthread库实现多线程下的原子操作: #include #...
Linux驱动并发控制之位原子操作.pdf
内核很容易产生竞争条件。同一时间可能有多个内核执行流在执行,内核的许多特性都要求能够并发地访问共享数据,这就要求有同步机制来同步各执行单元对共享数据的访问以保证不出现竞争条件
zynq的linux驱动5-使用原子操作实现mio资源的竞争保护,同一时刻只有一个进程使用mio
7.2.1 原子操作 153 7.2.2 自旋锁 155 7.2.3 信号量 156 7.3 并发控制实例 157 7.3.1 内核任务及其并发关系 158 7.3.2 实现机制 158 7.3.3 关键代码解释 162 7.3.4 实现步骤 163 习题7 164 第8章 文件系统 165 8.1 ...
线程基础代码,适合初学者阅读理解。包括原子操作,自旋锁
7掌握内核同步原理和方法:原子操作,自旋锁,(读—写)信号量,完成变量,bkl,seqlock和延迟内核抢占。了解指令“路障”。(4小时) 8介绍系统时钟和硬件定时器,单处理器和多处理器上的linux计时体系结构,...
c++基础封装(线程、锁、定时器、原子操作等),c++封装,接口方便好用。
描述了linux系统原子操作的实现以及使用原子操作时的注意事项。
Linux,全称GNU/Linux,是一种免费使用和自由传播的类UNIX操作系统,其内核由林纳斯·本纳第...【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.5.pdf>> <<LINUX内核设计与实现.pdf >> <<LINUX设备驱动程序(第3版).pdf>>
2 调试原子操作 四 引发bug并打印信息 1 BUG()和BUG_ON() 2 dump_stack() 五 printk() 1 printk函数的健壮性 2 printk函数脆弱之处 3 LOG等级 4 记录缓冲区 5 syslogd/klogd 6 dmesg 7 注意 8 内核printk和日志系统...
讲解linux下驱动开发,并发与竞争发生的原理,以及原子操作,自旋锁,信号量,互斥体的使用。ppt纯手工制作,希望对大家有所帮助。
嵌入式Linux设备驱动程序实例详解.pdf
嵌入式Linux中的进程同步无竞态读写.pdf
Linux内核是Linux操作系统中最核心的部分,用于实现对硬件部件的编程控制和接口操作。《Linux2.6内核标准教程》深入、系统地讲解了 Linux内核的工作原理,对Linux内核的核心组件逐一进行深入讲解。 全书共8章,首先...
6.2.4 管道的原子操作 233 6.2.5 关于半双工管道需要注意的几个 问题 233 6.3 命名管道 234 6.3.1 基本概念 234 6.3.2 创建FIFO 234 6.3.3 FIFO操作 235 6.3.4 FIFO上的阻塞动作 236 6.3.5 SIGPIPE信号 237 6.4 ...
6.2.4 管道的原子操作 233 6.2.5 关于半双工管道需要注意的几个 问题 233 6.3 命名管道 234 6.3.1 基本概念 234 6.3.2 创建FIFO 234 6.3.3 FIFO操作 235 6.3.4 FIFO上的阻塞动作 236 6.3.5 SIGPIPE信号 237 6.4 ...