同步互斥阻塞
Posted 梦提三尺剑
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了同步互斥阻塞相关的知识,希望对你有一定的参考价值。
一个设备在某一时刻只能由一个应用程序打开,为了防止某一设备同时被两个应用程序打开,可以设置一个全局变量。
调用设备的open函数后,变量值减一;调用关闭函数后,变量值加一。
如果第二个程序进入了设备,因为状态值已为0,所以无法打开。
分解该过程,其可分为三项:
a.读出变量值
b.修改
c.写会
Linux为多任务系统,如果A.a运行完后,再去运行B.a和B.b,容易出错。所以引进原子变量来避免这一问题。
原子操作
原子操作指的是在执行过程中不会被别的代码路径所中断的操作
常用原子操作函数举例:
atomic_t v = ATOMIC_INIT(0); //定义原子变量v的值为0
atomic_read(atomic_t *v); //返回原子变量的值
void atomic_inc(atomic_t *v); //原子变量增加1
void atomic_dec(atomic_t *v); //原子变量减去1
int atomic_dec_and_test(atomic_t *v) //自减操作后测试其是否为0,为0返回true,否则返回false
定义变量:
atomic_t v = ATOMIC_INIT(0); //定义原子变量v的值为0
atomic_read(atomic_t *v); //返回原子变量的值
void atomic_inc(atomic_t *v); //原子变量增加1
void atomic_dec(atomic_t *v); //原子变量减去1
int atomic_dec_and_test(atomic_t *v) //自减操作后测试其是否为0,为0返回true,否则返回false
static atomic_t canopen = ATOMIC_INIT(1); //定义原子变量,初始值为1
/*打开函数*/
static int sixth_drv_open(struct inode *inode, struct file *file) { if(!atomic_dec_and_test(&canopen)) { atomic_inc(&canopen) return -EBUSY; } }
/*关闭函数*/ int sixth_drv_close(struct inode *inode, struct file *file) { atomic_inc(&canopen); }
加入原子变量后,a,b,c三个过程一气呵成,不会被打断。
以上是关于同步互斥阻塞的主要内容,如果未能解决你的问题,请参考以下文章