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

猜你喜欢

转载自blog.csdn.net/tiantangmoke/article/details/103213602