使用互斥锁和二进制信号量。

4

据我理解,互斥锁(mutex)和二进制信号量(binary semaphore)非常相似,但我想知道在使用互斥锁优于二进制信号量或者反之的一些具体应用场景或情况。

2个回答

2

互斥锁(mutex)和二进制信号量(binary semaphore)之间的一个重要区别在于,线程不能解锁由另一个线程锁定的互斥锁(锁定互斥锁的线程是唯一的所有者):互斥锁仅用于临界区。在这种情况下,应该使用等待条件。虽然不太常见,但可以使用信号量来完成这个任务。有关优先级反转和安全性的其他注意事项,请参见此处


原则上,一个在一个作用域中锁定的“互斥锁”不能在不同的作用域中解锁,也不能由一个线程锁定并由另一个线程解锁,这没有任何理由。这些“特性”是任意添加的,由一些操作系统、一些编程语言和一些库的设计者添加,以帮助程序员编写更易于他人理解和分析的代码。“互斥锁”只是一个想法的名称——可以通过“信号量”对象实现的想法——而称为“信号量”的实际对象通常可以被一个线程锁定并由另一个线程解锁。 - Solomon Slow
注意:OP最近才将[C]标签添加到他们的问题中,这可能意味着他们正在使用Posix线程库(pthreads)。在pthreads中,如果互斥锁m被不同的线程锁定,则pthread_mutex_unlock(m)的效果是未定义的。WinAPI函数ReleaseMutex(m)更可靠:如果互斥锁m被不同的线程锁定,则保证会“失败”。另一方面,如果问题涉及Python,Python文档明确表示,threading.Lock对象可以被任何线程释放(),而不仅仅是拥有它的线程。 - Solomon Slow

2
一般来说 - 既然您没有提到任何特定的库或编程语言 - 互斥锁和二进制信号量非常相似。
二进制信号量是更一般的计数信号量的一个特化,这个概念早在1960年代初就被发明了。它有着惊人的多功能性(请参见{{link2:《信号量小书》}}),在过去的日子里,人们想象信号量将成为最底层的API,将内置于许多不同的操作系统中,以提供其他便携式同步方法和算法所构建的基石。
在我个人看来,如果你使用了一种叫做“mutex”或“lock”的东西,那么你应该只用它来做一件事:当线程访问共享变量时,用它来防止线程相互干扰。每当你想使用一个mutex来让一个线程向另一个线程发送某种信号时,那就是你应该使用“semaphore”的时候了。虽然它们都实际上做了同样的事情,但使用正确的名称将帮助其他人读懂你的代码。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接