我想知道二进制信号量和互斥量之间的区别?这些是一样的吗?二进制信号量的值为1和0,具有类似锁定和解锁的互斥。
我真的对这些术语感到困惑。我说的是应用程序级编程的观点。在一次采访中,有人问我这个问题,我向他们解释了信号量是用来发信号的,互斥是用来锁定的。请用简单的例子来解释。我在谷歌上搜索了一下,但发现除了上面的区别之外,信号量锁可以由其他线程解锁,而互斥锁必须由锁定它的线程解锁
取决于您如何看待它。
在概念层二进制信号量提供互斥-保证只有一个线程将进入关键部分。Tanenbaum在他的书"操作系统"Ed.3中介绍了互斥,并用下面的句子:
当不需要信号量的计数能力时,有时会使用称为互斥的信号量的简化版本。
然而,信号量通常是对具有P()
和V()
函数的经典Dijkstra概念的引用,而互斥是一个非常宽泛的术语。这就是Linus Torvalds在信号量上所说的:
旋转锁是一种互斥机制,而不是信号量(信号量是一种非常特殊的互斥类型)。
(来自comp.os.linux.development.system:Re:NT内核家伙玩linux)
在实现层互斥可以实现为信号量,即在Linux 2.4中:http://lxr.free-electrons.com/source/include/asm-i386/semaphore.h?v=2.4.37#L89
通常mutex有更复杂的实现和更广泛的概念:
- 互斥体有
owner
字段——当前进入互斥体的线程。它提供了各种好处,如可重新输入互斥、优先级反转等 - 虽然信号量通常是无法获取它的阻塞线程,但互斥体可能是自适应的(就像在Solaris中一样),它可以旋转(忙着等待互斥体解锁)
- 信号量通常通过递增/递减计数器实现,但互斥体可能使用原子交换和测试操作
其中一些想法来自维基百科:w:Symaphore(编程)