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);

你可能感兴趣的:(linux)