我想知道二进制信号量和互斥量之间的区别?这些是一样的吗?二进制信号量的值为1和0,锁定和解锁等互斥量 .
我对这些术语感到很困惑 . 我正在谈论应用程序级编程的观点 . 在一次采访中,我被问到这个问题,并向他们解释信号量用于发信号,互斥量用于锁定 . 请用简单的例子来解释 . 我用Google搜索,但后来知道除了上述差异之外,信号量锁可以被其他线程解锁,而互斥锁必须由锁定它的线程解锁 .
取决于你如何看待它 .
在 concept layer 二进制信号量提供互斥 - 保证只有一个线程将进入临界区 . 即Tanenbaum在他的书"Operating Systems" Ed . 3引入了以下句子的互斥:
当不需要信号量的计数能力时,有时会使用简化版本的信号量称为互斥量 .
但是,信号量通常是对具有 P() 和 V() 函数的经典Dijkstra概念的引用,而互斥量是非常宽泛的术语 . 这就是Linus Torvalds在信号量上所说的:
P()
V()
自旋锁是一种互斥机制,而不是信号量(信号量是一种非常特殊的互斥) .
(来自comp.os.linux.development.system:Re: NT kernel guy playing with Linux)
在 implementation layer 上,互斥锁可以实现为信号量,即在Linux 2.4中:http://lxr.free-electrons.com/source/include/asm-i386/semaphore.h?v=2.4.37#L89
通常,互斥体具有更复杂的实现和更广泛的概念:
Mutex有 owner field - 当前进入互斥锁的线程 . 它提供了各种好处,如可重复进入的互斥,优先级倒置等 .
owner
虽然信号量通常是无法获取它的块线程,但是互斥量可能是自适应的(如在Solaris中)可以旋转(忙等待直到互斥锁被解锁) .
信号量通常通过递增/递减计数器实现,但互斥体可以使用原子交换和测试操作 .
其中一些想法来自维基百科:w:Semaphore (programming)
1 回答
取决于你如何看待它 .
在 concept layer 二进制信号量提供互斥 - 保证只有一个线程将进入临界区 . 即Tanenbaum在他的书"Operating Systems" Ed . 3引入了以下句子的互斥:
但是,信号量通常是对具有
P()
和V()
函数的经典Dijkstra概念的引用,而互斥量是非常宽泛的术语 . 这就是Linus Torvalds在信号量上所说的:(来自comp.os.linux.development.system:Re: NT kernel guy playing with Linux)
在 implementation layer 上,互斥锁可以实现为信号量,即在Linux 2.4中:http://lxr.free-electrons.com/source/include/asm-i386/semaphore.h?v=2.4.37#L89
通常,互斥体具有更复杂的实现和更广泛的概念:
Mutex有
owner
field - 当前进入互斥锁的线程 . 它提供了各种好处,如可重复进入的互斥,优先级倒置等 .虽然信号量通常是无法获取它的块线程,但是互斥量可能是自适应的(如在Solaris中)可以旋转(忙等待直到互斥锁被解锁) .
信号量通常通过递增/递减计数器实现,但互斥体可以使用原子交换和测试操作 .
其中一些想法来自维基百科:w:Semaphore (programming)