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

互斥锁

“互斥体(互斥)”指的是任何可以睡眠的强制互斥锁,比如计数是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(互斥);

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



互斥使用场景

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

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

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

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

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

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

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


自旋锁和互斥锁

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




参考:

“Linux的内核设计与实现”



猜你喜欢

转载自blog.csdn.net/hhhanpan/article/details/80558119
今日推荐