二进制信号量和互斥量之间的区别是什么



我想知道二进制信号量和互斥量之间的区别?这些是一样的吗?二进制信号量的值为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(编程)

最新更新