【问题标题】:what is the difference between binary semaphore and mutex?二进制信号量和互斥量有什么区别?
【发布时间】:2015-05-24 09:33:34
【问题描述】:

我想知道二进制信号量和互斥量的区别? 这些是一样的吗?二进制信号量的值是 1 和 0,具有锁和解锁之类的互斥锁。

我真的对这些术语感到困惑。我说的是应用程序级编程视角。在一次采访中,有人问我这个问题,并向他们解释说,信号量是用来发信号的,而互斥量是用来加锁的。请用简单的例子解释。我google了一下,发现除了上面的区别之外,信号量锁可以被其他线程解锁,而互斥锁必须由锁定它的线程解锁。

【问题讨论】:

标签: synchronization multithreading semaphore


【解决方案1】:

取决于你如何看待它。

概念层 二进制信号量提供互斥 - 保证只有一个线程会进入临界区。 IE。 Tanenbaum 在他的“操作系统”一书中。 3 用下面这句话介绍互斥锁:

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

然而,semaphore 通常是对具有 P()V() 函数的经典 Dijkstra 概念的引用,而 mutex 是一个非常宽泛的术语。这就是 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 字段——当前进入互斥锁的线程。它提供了各种好处,例如可重新输入的互斥体、优先级反转等。
  • 虽然 semaphore 通常会阻塞无法获取它的线程,但 mutex 可能是自适应的(如在 Solaris 中),可以 spin(忙- 等到互斥锁解锁)。
  • 信号量通常通过递增/递减计数器实现,但互斥体可能使用原子交换和测试操作。

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

【讨论】:

    猜你喜欢
    • 2010-09-08
    • 2011-01-20
    • 2020-04-05
    • 2011-06-24
    • 1970-01-01
    • 2022-11-01
    • 2021-08-14
    • 2017-11-19
    相关资源
    最近更新 更多