Linux内核当中的互斥锁

时间:2020-12-26 19:43:58
Linux可以使用互斥信号量来表示互斥锁,那就是通过宏DECLARE_MUTEX来定义一个互斥信号量,因为DECLARE_MUTEX这个宏,Marcin Slusarz在08年提交的了一个patch,邮件地址为: https://lkml.org/lkml/2008/10/26/74,Marcin Slusarz认为DECLARE_MUTEX宏会误导开发者,所以建议将DECLARE_MUTEX修改成DEFINE_SEMAPHORE,这个提议最终被内核社区所接受,在2.6.36版本后的内核就没有DECLARE_MUTEX这个宏了,取而代之的是DEFINE_SEMAPHORE宏,在后来同互斥信号量相关的init_MUTEX、init_MUTEX_LOCKED也从<linux/semaphore.h>文件中移除了。
虽然可以使用信号量来表示互斥锁,但是互斥锁其实是存在的,只是前面的宏DECLARE_MUTEX因为会引起歧义,所以修改成了DEFINE_SEMAPHORE,mutex在2.6.16版本就融入到了主内核中了,使用mutex需要包含头文件<linux/mutex.h>,例如:
/* Statically declare a mutex. To dynamically   create a mutex, use mutex_init() */
static DEFINE_MUTEX(mymutex);

/* Acquire the mutex. This is inexpensive if there
* is no one inside the critical section. In the face of
* contention, mutex_lock() puts the calling thread to sleep.
*/
mutex_lock(&mymutex);

/* Critical Section code ... */

mutex_unlock(&mymutex); /* Release the mutex */

 使用宏DEFINE_MUTEX静态定义和初始化一个互斥锁,如果需要动态初始化,那么使用函数mutex_init(),原型如下:
 void mutex_init(struct mutex *mutex);
 
 mutex_lock和mutex_unlock分别是对临界区进行加锁和解锁,机制同信号量都差不多,在临界区不能被访问是引起进程的休眠而不是忙等。同信号量一样,mutex也有mutex_lock_interruptible和mutex_trylock,所有的函数原型如下:
 void mutex_lock(struct mutex *lock); int mutex_lock_interruptible(struct mutex *lock);
 int mutex_trylock(struct mutex *lock);
 void mutex_unlock(struct mutex *lock);