二进制信号量和互斥量之间有什么区别?

时间:2015-03-20 13:17:05

标签: synchronization multithreading semaphore

我想知道二进制信号量和互斥量之间的区别吗? 这些是一样的吗?二进制信号量的值为1和0,其中互斥锁如锁定和解锁。

我对这些条款感到很困惑。我正在谈论应用程序级编程的观点。在一次采访中,我被问到这个问题,并向他们解释信号量用于发信号,互斥量用于锁定。请用简单的例子来解释。我用Google搜索,但后来知道除了上述差异之外,信号量锁可以被其他线程解锁,而互斥锁必须由锁定它的线程解锁。

1 个答案:

答案 0 :(得分:2)

取决于您如何看待它。

概念层 二进制信号量提供互斥 - 保证只有一个线程会进入关键部分。即Tanenbaum在他的书"操作系统"埃德。 3引入了带有以下句子的互斥体:

  

当不需要信号量的计数能力时,有时会使用称为互斥的信号量的简化版本。

但是,信号量通常是对具有P()V()函数的经典Dijkstra概念的引用,而互斥是非常宽泛的术语。这就是Linus Torvalds对信号量的看法:

  

自旋锁是互斥机制,而不是信号量(信号量   是一种非常具体的互相排斥的

(来自comp.os.linux.development.system:Re: NT kernel guy playing with Linux

实施层 互斥上可以实现为信号量,即在Linux 2.4中:http://lxr.free-electrons.com/source/include/asm-i386/semaphore.h?v=2.4.37#L89

通常 mutex 具有更复杂的实现和更广泛的概念:

  • Mutex有owner字段 - 当前进入互斥锁的线程。它提供各种好处,如可重复进入的互斥,优先级倒置等。
  • 虽然信号量通常是无法获取它的块线程,但 mutex 可能是自适应的(如在Solaris中)可以旋转(忙碌)等到互斥锁解锁后。)
  • 信号量通常通过递增/递减计数器实现,但互斥可以使用原子交换和测试操作。

其中一些想法来自维基百科:w:Semaphore (programming)