zoukankan      html  css  js  c++  java
  • 同步互斥阻塞

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

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

  • 相关阅读:
    HEOI2016 题解
    数据结构考前复习【已弃】
    BZOJ 3993: [SDOI2015]星际战争 [二分答案 二分图]
    BZOJ 4698: Sdoi2008 Sandy的卡片 [后缀自动机]
    BZOJ 3990: [SDOI2015]排序 [搜索]
    字符串考前总结
    BZOJ 3881: [Coci2015]Divljak [AC自动机 树链的并]
    CF698C. LRU [容斥原理 概率]
    BZOJ 2707: [SDOI2012]走迷宫 [高斯消元 scc缩点]
    BZOJ 1444: [Jsoi2009]有趣的游戏 [AC自动机 高斯消元]
  • 原文地址:https://www.cnblogs.com/stm32f4/p/7672863.html
Copyright © 2011-2022 走看看