• 同步互斥阻塞


    目的:让一个驱动程序在同一时刻只能被一个进程使用。

    方法:可以用原子操作也可以用信号量,用信号量的话还涉及到阻塞方式和非阻塞方式。

    1. 原子操作
    原子操作指的是在执行过程中不会被别的代码路径所中断的操作。
    常用原子操作函数举例:
    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。

    2. 信号量
    信号量(semaphore)是用于保护临界区的一种常用方法,只有得到信号量的进程才能执行临界区代码。
    当获取不到信号量时,进程进入休眠等待状态。

    定义信号量
    struct semaphore sem;
    初始化信号量
    void sema_init (struct semaphore *sem, int val);
    void init_MUTEX(struct semaphore *sem);//初始化为0

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

    获得信号量
    void down(struct semaphore * sem);
    int down_interruptible(struct semaphore * sem);
    int down_trylock(struct semaphore * sem);//试图获取信号量,如果获取不到就立刻返回,就不会休眠。
    释放信号量
    void up(struct semaphore * sem);

    注意:在open函数里面

    3. 阻塞
    阻塞操作
    是指在执行设备操作时若不能获得资源则挂起进程,直到满足可操作的条件后再进行操作。
    被挂起的进程进入休眠状态,被从调度器的运行队列移走,直到等待的条件被满足。

    非阻塞操作
    进程在不能进行设备操作时并不挂起,它或者放弃,或者不停地查询,直至可以进行操作为止。

    fd = open("...", O_RDWR | O_NONBLOCK);

  • 相关阅读:
    hdu1290献给杭电五十周年校庆的礼物
    hdu1181(变形课)
    Flex结合java实现一个登录功能
    MyEclipse安装spket插件
    线程安全的理解
    很实用的一个ext表格,具有很好的分页功能。
    tomcat配置数据源
    extanychart柱状图呈现取自数据库中的数据
    extanychart饼图呈现取自数据库中的数据
    oracle实现分页总结
  • 原文地址:https://www.cnblogs.com/physworld/p/14843487.html
Copyright © 2020-2023  润新知