互斥体
与信号量只取0、1时有相同的表现形式。
相关代码
1.定义互斥结构体,并初始化
2.获取互斥体
mutex_lock () 与mutex_lock_interruptible () 的区别:前者引起的睡眠不能被信号打断,而后者可以。mutex_trylock ()用于尝试获得mutex,获取不到mutex时不会引起进程睡眠。
3.释放互斥体
完整使用案例:
互斥体是进程级的,用于多个进程之间对资源的互斥,虽然也是在内核中,但是该内核执行路径是以进程的身份,代表进程来争夺资源的。如果竞争失败,会发生进程上下文切换,当前进程进入睡眠状态,CPU将运行其他进程。鉴于进程上下文切换的开销也很大,因此,只有当进程占用资源时间较长时,用互斥体才是较好的选择。
由此,可以总结出自旋锁和互斥体选用的3项原则:
1)当锁不能被获取到时,使用互斥体的开销是进程上下文切换时间,使用自旋锁的开销是等待获取自旋锁(由临界区执行时间决定)。若临界区比较小,宜使用自旋锁,若临界区很大,应使用互斥体。
2)互斥体所保护的临界区可包含可能引起阻塞的代码,而自旋锁则绝对要避免用来保护包含这样代码的临界区。因为阻塞意味着要进行进程的切换,如果进程被切换出去后,另一个进程企图获取本自旋锁,死锁就会发生。
3)互斥体存在于进程上下文,因此,如果被保护的共享资源需要在中断或软中断情况下使用,则在互斥体和自旋锁之间只能选择自旋锁。当然,如果一定要使用互斥体,则只能通过mutex_trylock ()方式进行,不能获取就立即返回以避免阻塞。