定义互斥锁:
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 版权协议,转载请附上原文出处链接和本声明。