linux驱动学习笔记 同步互斥阻塞

概述

linux驱动如果多个进程同时访问,会导致不可预料的后果,所以需要一些机制来限制这种情况发生

知识点

  • 原子操作
  • 信号量和互斥锁
  • 非阻塞

原子操作

atomic_dec_and_test函数执行的时候,不会跳转到别的线程运行,所以是安全的

1、定义一个原子变量,并初始化为1
atomic_t v = ATOMIC_INIT(1);

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);

信号量和互斥锁

static DECLARE_MUTEX(button_lock);     //定义互斥锁信号量

//如果无法获取信号量就立即休眠
down_trylock(&button_lock)

//如果无法获取信号量就休眠
down(&button_lock);

//释放信号量
up(&button_lock);


非阻塞

//应用程序中,打开文件时加入O_NONBLOCK属性
fd = open("/dev/buttons", O_RDWR | O_NONBLOCK);

/*
在驱动的open函数,判断文件属性
如果文件有O_NONBLOCK属性,
则使用非阻塞的down_trylock,在读取不到数据或是写入缓冲区已满会马上return,而不会阻塞等待。
*/
if (file->f_flags & O_NONBLOCK)
{
	if (down_trylock(&button_lock))
		return -EBUSY;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值