Linux: spinlock and mutex

  访问共享资源的代码区域称为临界区。自旋锁(spinlock)和互斥体(mutex)是保护内核临界区的两种基本机制。

  自旋锁可以确保在同时只有一个线程进入临界区,其它想进入临界区的线程必须不停地原地打转,直到第一个线程释放自旋锁。

  下面的例子演示了自旋锁的基本用法:

  #include <linux/spinlock.h>

  spinlock_t my_lock = SPIN_LOCK_UNLOCKED;

  spin_lock(&my_lock);

  /* Critical Section code ... */

  spin_unlock(&my_lock);

 

  对于抢占内核及SMP机器,使用自旋锁的irq变体 spin_lock_irqsave()/spin_lock_irqrestore()。

 

  互斥体在进入一个被占用的临界区之前不会原地打转,而是使当前线程进入睡眠状态。如果要等待的时间较长,互斥体比自旋锁

  更合适。

  因此在很多情况下,决定使用自旋锁还是互斥体相对来说很容易:

  1) 如果临界区需要睡眠,只能使用互斥体,因为在获得自旋锁后进行调度、抢占以及在等待队列上睡眠都是非法的。

  2) 由于互斥体会在面临竞争的情况下将当前线程置于睡眠状态,因此,在中断处理函数中,只能使用自旋锁。

  互斥体使用的基本方法:

  #include <linux/mutex.h>

  static DEFINE_MUTEX(my_mutex);

  mutex_lock(&my_mutex);

  /* Critical Section code ... */

  mutex_unlock(&my_mutex);

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值