linux 驱动 同步的 终极总结

1. 原子操作

atomic_t lock;
/* 原子变量
*/
atomic_set(&gpioled.lock, 1); /* 原子变量初始值为 1 */
/* 通过判断原子变量的值来检查 LED 有没有被别的应用使用 */
 if (!atomic_dec_and_test(&gpioled.lock)) {
         atomic_inc(&gpioled.lock); /* 小于 0 的话就加 1,使其原子变量等于 0 */
         return -EBUSY; /* LED 被使用,返回忙 */
 }
atomic_inc(&dev->lock);

2. 信号量

#include <linux/semaphore.h>
struct semaphore sem; /* 信号量 */
sema_init(&gpioled.sem, 1);
/* 获取信号量,进入休眠状态的进程可以被信号打断 */
if (down_interruptible(&gpioled.sem)) {
        return -ERESTARTSYS;
}
#if  0
down(&gpioled.sem); /* 不能被信号打断 */
#endif
up(&dev->sem); /* 释放信号量,信号量值加 1 */
当信号量 sem 1 的时候表示 LED 灯还没有被使用,如果应用程序 A 要使用
LED 灯,先调用 open 函数打开 /dev/gpioled ,这个时候会获取信号量 sem ,获取成功以后 sem
值减 1 变为 0 。如果此时应用程序 B 也要使用 LED 灯,调用 open 函数打开 /dev/gpioled 就会因
为信号量无效 ( 值为 0) 而进入休眠状态。当应用程序 A 运行完毕,调用 close 函数关闭 /dev/gpioled
的时候就会释放信号量 sem ,此时信号量 sem 的值就会加 1 ,变为 1 。信号量 sem 再次有效,表
示其他应用程序可以使用 LED 灯了,此时在休眠状态的应用程序 B 就会获取到信号量 sem ,获
取成功以后就开始使用 LED 灯。

3. 自旋锁

int dev_stats; /* 设备状态,0,设备未使用;>0,设备已经被使用 */
spinlock_t lock; /* 自旋锁 */
dev_stats = 0;
spin_lock_init(&gpioled.lock);
spin_lock_irqsave(&gpioled.lock, flags); /*上锁 */
if (gpioled.dev_stats) { /* 如果设备被使用了 */
        spin_unlock_irqrestore(&gpioled.lock, flags); /* 解锁 */
        return -EBUSY;
}
gpioled.dev_stats++; /* 如果设备没有打开,那么就标记已经打开了 */
spin_unlock_irqrestore(&gpioled.lock, flags);/* 解锁 */
/* 关闭驱动文件的时候将 dev_stats 减 1 */
spin_lock_irqsave(&dev->lock, flags); /* 上锁 */
if (dev->dev_stats) {
    dev->dev_stats--;
}
spin_unlock_irqrestore(&dev->lock, flags);/* 解锁 */

4. 互斥体

struct mutex lock; /* 互斥体 */
mutex_init(&gpioled.lock);
 /* 获取互斥体,可以被信号打断 */
if (mutex_lock_interruptible(&gpioled.lock)) {
         return -ERESTARTSYS;
}
#if 0
mutex_lock(&gpioled.lock); /* 不能被信号打断 */
#endif
mutex_unlock(&dev->lock);
互斥体和二值信号量类似,只不过互斥体是专门用于互斥访问的。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦幽风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值