码迷,mamicode.com
首页 > 其他好文 > 详细

同步互斥阻塞

时间:2017-10-15 19:35:10      阅读:156      评论:0      收藏:0      [点我收藏+]

标签:执行   and   原子操作   open   同步   操作   互斥   函数   can   

一个设备在某一时刻只能由一个应用程序打开,为了防止某一设备同时被两个应用程序打开,可以设置一个全局变量。

调用设备的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三个过程一气呵成,不会被打断。

 

同步互斥阻塞

标签:执行   and   原子操作   open   同步   操作   互斥   函数   can   

原文地址:http://www.cnblogs.com/stm32f4/p/7672863.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!