Linux内核当中的互斥锁

本文介绍了Linux中互斥信号量的定义方式从DECLARE_MUTEX更改为DEFINE_SEMAPHORE的原因及过程,解释了互斥锁在2.6.16版本的引入,并详细说明了静态和动态初始化互斥锁的方法。文中还提供了关键函数的使用示例,如mutex_lock和mutex_unlock,展示了如何在临界区中确保线程安全。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值