嗯,这个话题并不像看起来那么简单。正如我们所知,mutex
可以由初始计数为 1 的信号量实现。
但是通过几篇文章,我也发现在将这两者分开并将 mutex
视为不同于 semaphore
的独立概念方面付出了巨大的努力>
Priority Inversion的问题,这导致了一个新概念priority inheritance ,让我有些困惑。
还有一些人谈到关于 ownership
的互斥量(如 what-is-mutex-and-semaphore-in-java-what-is-the-main-difference 中所示)。好吧,ownership
是个糟糕的术语。 Mutex 绝不是共享资源的所有者。 Holding a Lock
和 Releasing a Lock
是一种有效的信号传递方式,例如,*嘿等等!!直到我完成并向你发出信号*
寻找导致 Mutex
与 Semaphore
(初始计数 = 1)分离的具体原因
最佳答案
所有权意味着您不能在一个线程中锁定互斥量并在另一个线程中释放。所以信号量更具有通用性。您可以只用一个信号量实现哑互斥量,但不能只用一个互斥量实现信号量。
优先级反转有以下几种情况:
1)高优先级线程A等待mutex
2) 低优先级线程 B 持有它但在释放它之前无法执行
3)中优先级线程C占用CPU
要处理这种情况调度程序应该有一些逻辑:
尽早启动 A 让 B 代替 C 执行
要了解是 B 阻止了 A,它必须知道互斥量所有者。 对于信号量,不可能说出谁解锁了它:B 或 C。因此无法执行此类逻辑。
关于java - 信号量和互斥量在优先级反转方面的区别(也许还有优先级继承),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20949071/