LINUX锁之自旋锁(C++)

自旋锁与互斥锁在加锁机制上有区别,自旋锁会在锁不可用时持续检查,适合等待时间短的情况。自旋锁可在任何上下文使用,如进程、中断上下文。根据上下文不同,应选择合适的锁宏,如spin_lock_bh、spin_lock_irq等。选择锁宏要考虑进程、软中断、tasklet、timer、硬中断的上下文交互,确保资源访问的正确同步。
摘要由CSDN通过智能技术生成

自旋锁跟互斥锁有点类似,加锁时,如果锁变量没有被占用,则加锁成功,继续下面的代码,不同的是,如果失败,自旋锁会一直循环检查锁变量是否可用,互斥锁是线程被阻塞,可以看到,锁变量不可用时,自旋锁会一直占用CPU,而互斥锁不会。

自旋锁适合于等待时间非常短的情况,它可以在任何上下文使用(进程上下文,中断上下文)。如果被保护的共享资源只在进程上下文访问,使用信号量保护该共享资源非常合适,因为信号量会阻塞进程,如果对共享资源的访问时间非常短,自旋锁也可以。但是如果被保护的共享资源需要在中断上下文访问(包括底半部即中断处理句柄和顶半部即软中断),就必须使用自旋锁。

自旋锁定义/初始化/使用/销毁代码如下:

#include <linux/spinlock.h> 
spinlock_t spinlock=SPIN_LOCK_UNLOCKED;//静态初始化
动态初始化的方式:
spinlock_t spinlock;
spin_lock_init(spinlock);

spin_lock(spinlock);
对自旋锁进行加锁,如果能够获得锁,则立马加锁,如果获取不到,则在原地旋转,知道能获得锁。

spin_unlock_wait(spinlock);
等待自旋锁不被任何执行单元保持,如果没有任何单元保持该自旋锁,则立即返回,否则将循环在哪里直到自旋锁被释放。

spin_trylock_wait(spinlock);
尽力获得自旋锁,如果能够立即获得返回真,不能立即获得返回假,并不在原地等待。

spin_lock_irqsa
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值