IMX6ULL嵌入式Linux驱动学习笔记(七)

本文围绕Linux并发与竞争展开,介绍了多线程访问共享资源时产生的并发与竞争现象。还阐述了原子操作、原子位操作、自旋锁、信号量和互斥锁等机制,包括各自的特点、适用场景、使用注意事项及相关函数和示例。


IMX6ULL嵌入式Linux驱动开发学习

以下内容是我在学习正点原子IMX6ULL开发板alpha中记录的笔记,部分摘录自正点原子IMX6ULL开发手册

Linux并发与竞争

一、并发与竞争

多线程对共享资源同时进行访问,比如全局变量,就会产生并发与竞争现象。以打印机为例,当线程A和线程B同时操作打印机时,就会出现竞争现象,如果没有处理就会导致数据错乱。

二、原子操作atomic

对整形变量或者位进行保护,确保对其进行操作时是最小操作,不会被干扰。

typedef struct {
   
   
    int counter;
} atomic_t;

atomic_t a = ATOMIC_INIT(0);	// 定义原子变量a并赋初值为0;

原子操作API函数

AIOMIC_INIT(int i)							// 定义原子变量的时候对其初始化
int atomic_read(atomic_t* v)				// 读取原子变量的值,并返回
void atomic_set(atomic_t* v, int i)			// 给原子变量设置为i值
void atomic_add(int i, atomic_t* v)			// 给原子变量加上i值
void atomic_sub(int i, atomic_t* v)			// 给原子变量减去i值
void atomic_inc(atomic_t* v)				// 原子变量自增1
void atomic_dec(atomic_t* v)				// 原子变量自减1
int atomic_dec_return(atomic_t* v)			// 原子变量减1,并且返回v的值
int atomic_inc_return(atomic_t* v)			// 原子变量加1,并且返回v的值
int atomic_sub_and_test(int i, atomic_t* v)	// 从v减i,如果结果为0就返回真,否则返回假
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值