互斥锁 (mutex)

  • Post author:
  • Post category:其他


定义互斥锁:

struct mutex my_mutex;

初始化互斥锁:

mutex_init(&my_mutex);

获取互斥锁:

void mutex_lock(struct mutex *lock);
int mutex_lock_interruptible(struct mutex *lock);
int mutex_trylock(struct mutex *lock);

mutex_lock()与mutex_lock_interruptible()的区别是前者引起的睡眠不会被信号打断,而后者可以。mutex_trylock()用于尝试获得mutex,获取不到mutex时不会引起进程睡眠。

释放互斥锁:

void mutex_unlock(struct mutex *lock);

mutex的使用方法和信号量用于互斥的场合完全一样,

struct mutex my_mutex;	//定义互斥锁
mutex_init(&my_mutex);	//初始化互斥锁

mutex_lock(&my_mutex);	//获取互斥锁
	... code need lock
mutex_unlock(&my_mutex);	//释放互斥锁

自旋锁和互斥锁都是解决互斥问题的基本手段,这两种所的区别:

1,互斥锁和自旋锁属于不同层次的互斥手段,前者的实现依赖于后者,在互斥体本身的实现上,为了保证互斥体结构存取的原

子性,需要自旋锁来互斥,因此自旋锁属于更底层的操作。

2,互斥锁是进程级别的,用于对各进程之间对资源的互斥,虽然也在内核中,但是该内核执行路径是以进程的身份,代表进程来争夺资源的,如果竞争失败,会发生进程上下文的切换,当前进程进入睡眠状态,CPU将运行于其他进程。由于进程上下文切换开销比较大,因此进程占用资源时间较长时用互斥锁才是比较好的选择。

3,当要保护的临界区访问时间很短时,用自旋锁是非常方便的,因为它可以节省上下文切换的开销。但是CPU如果得不到自旋锁会忙等执行临界区解锁为止,所以要求锁不能再临界区长时间停留。



版权声明:本文为u014100559原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。