如果二进制信号量可以原子地保护资源,那么互斥锁的好处是什么。
例如,
sem_init(&sem, 0, 1);
sem_wait(&sem);
critical session;
sem_post(&sem);
请澄清互斥相对于信号量的任何好处。
答案1
根据 Robert Love 所著的《Linux 内核开发》(第 3 版),互斥体是比信号量更新的发明,“但具有更简单的接口、更高效的性能以及对其使用的额外限制”(第 195 页)。虽然与计数为 1 的信号量类似,但不可能像信号量那样获得更高的计数。此外,只有一个任务可以持有互斥锁,锁定者只能解锁互斥锁(即不能从其他上下文解锁),禁止递归锁定和解锁,进程在持有互斥锁时不能退出,互斥锁不能被进程获取。中断处理程序或“下半部分”,只能通过官方 API 进行管理。还有一种调试模式可以帮助查找违反上述约束的情况。
文本建议默认使用互斥体,除非上述限制之一出现问题。特别是,互斥体对于长锁定时间是首选,并且需要在持有锁时必须休眠的事物。 (还有关于互斥锁与自旋锁的相关讨论可能值得一读。)
答案2
对于互斥锁,只有锁定互斥锁的线程才能解锁该互斥锁。然而,任何线程都可以增加或减少信号量。