Linux 自旋锁 使用

自旋锁的作用

解决并发访问临界资源时,竞争资源问题。如有两个线程A,B同时访问一块内存区域,就可以用一个自旋锁来对这块内存区域进行保护,确保同一时间点只有一个线程访问内存。线程在访问内存前都要先获取锁,只有获取到锁才能访问内存,没有获取到锁则继续查询锁是否可用,直到锁可用才能访问内存区域里的数据

自旋锁API

DEFINE_SPINLOCK(spinlock_t lock) 定义并初始化化一个自旋锁

int spin_lock_init(spinlock_t *lock) 初始化自旋锁

void spin_lock(spinlock_t *lock) 获取指定的自旋锁 即加锁

void spin_unlock(spinlock_t *lock) 释放自旋锁 或 解锁

int spin_trylock(spinlock_t *lock) 尝试获取指定的自旋锁,如果没有获取到就返回 0

int spin_is_locked(spinlock_t *lock)  检查指定的自旋锁是否被获取,如果没有被获取就返回非 0,否则返回 0

void spin_lock_irq(spinlock_t *lock)      禁止本地中断,并获取自旋锁

void spin_unlock_irq(spinlock_t *lock)   激活本地中断,并释放自旋锁

void spin_lock_irqsave(spinlock_t *lock,unsigned long flags) 保存中断状态,禁止本地中断,并获取自旋锁

void spin_unlock_irqrestore(spinlock_t*lock, unsigned long flags) 

将中断状态恢复到以前的状态,并且激活本地中断,释放自旋锁

自旋锁简单使用

1  DEFINE_SPINLOCK(lock)  定义并初始化一个自旋锁

/* 线程 A */
 void functionA (){
     unsigned long flags;  /* 中断状态 */
     spin_lock_irqsave(&lock, flags) /* 获取锁 */
     /* 临界区 */
     spin_unlock_irqrestore(&lock, flags) /* 释放锁 */
 }

 /* 中断服务函数 */
 void irq() {
     spin_lock(&lock)  /* 获取锁 */
     /* 临界区 */
     spin_unlock(&lock) /* 释放锁 */
 }


 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值