Linux内核同步方法——互斥锁

时间:2022-02-24 19:39:22

互斥锁

“互斥体(互斥)”指的是任何可以睡眠的强制互斥锁,比如计数是1的信号量。

    也就是说,互斥体是一种互斥信号。

    互斥在内核中对应数据结构互斥,其行为和使用计数为1的信号量类似,因为是直接调用的信号量的操作接口,实现更高效,而且使用限制更强。也就是一个简化版的信号量,因为不需要管理任何使用计数。


#define MUTEX_DEFAULT 0x0 typedef struct semaphore mutex_t;
 #define mutex_init(lock,type,name)sema_init(lock,1) #define mutex_destroy(锁定)sema_init(锁定,-99) #define mutex_lock(lock,num)向下(锁定) #define mutex_trylock(lock)(down_trylock(lock)?0:1) #define mutex_unlock(锁定)向上(锁定)


静态的定义互斥体,

DEFINE_MUTEX(名);

动态初始化互斥,

调用mutex_init(互斥);

加锁和解锁:

的mutex_lock(互斥); / *临界区* / mutex_unlock(互斥);

互斥的基本操作列表如下:

Linux内核同步方法——互斥锁


互斥使用场景

·任何时刻只有一个任务可以持有mutex,也就是说mutex的使用计数永远是1。

·在同一上下文中上锁和解锁。切记不能在一个上下文中锁定一个mutex,而在另一个上下文中给它解锁。这个限制使得mutex不适合内核同用户空间复杂的同步场景。

·不能递递地持有同一个锁。也就是不能递上地上锁和解锁,同样也不能去解锁一个已经被解开的互斥。

·当持有一个互斥时,进程不可以退出。

·mutex不能在中断或者下半部中使用,即使使用mutex_trylock()也不行。

·mutex不可被手动初始化,拷贝或者重复初始化。

    相比信号量,优先使用使用互斥。如果不能满足其约束条件,且没有其他别的选择时,再考虑选择信号量。


自旋锁和互斥锁

    编程中,了解何时使用自旋锁,何时使用互斥锁(或信号量)是很重要的一般情况下,再中断上下文中只能使用自旋锁;而在任务睡眠时只能使用互斥锁。

Linux内核同步方法——互斥锁



参考:

“Linux的内核设计与实现”