0
回答
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);

 

 


原文链接:http://blog.csdn.net/zmyde2010/article/details/5877666
<无标签>
举报
长平狐
发帖于6年前 0回/357阅
顶部