【问题标题】:Difference between Semaphore and Mutex with respect to Priority Inversion ( and also, perhaps, priority inheritance )Semaphore 和 Mutex 在优先级反转(也许还有优先级继承)方面的区别
【发布时间】:2014-01-23 19:17:50
【问题描述】:

这个话题并不像看起来那么简单。正如我们所知,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 LockReleasing a Lock,实际上是一种发信号的方式,也许像 *Hey wait !! Till I complete and signal you*

寻找导致MutexSemaphore 分离的具体原因(初始计数= 1)

【问题讨论】:

    标签: java multithreading concurrency


    【解决方案1】:

    所有权意味着您不能在一个线程中锁定互斥锁并在另一个线程中释放。所以信号量更通用。你可以只用一个信号量来实现哑互斥量,但你不能只用一个互斥量来实现信号量。

    优先级倒置是以下情况:

    1) 高优先级线程A等待互斥锁

    2) 低优先级线程 B 持有它但在释放它之前无法执行导致

    3) 中优先级线程C占用CPU

    调度器要处理这种情况应该有一些逻辑:

    为了尽快启动 A,让 B 代替 C 执行

    要了解是 B 阻止了 A,它必须知道互斥锁的所有者。 对于信号量,不可能说是谁解锁了它:B 还是 C。所以没有办法执行这种逻辑。

    【讨论】:

    • 是的,你是对的。为了使优先级继承起作用,线程 B 将暂时继承更高优先级线程 A 的优先级。本质上只是一个conditional variable,例如semaphore 并不总是足够的。尽管可以使用信号量模拟mutex,但仅适用于有限的场景集。例如:recursive mutexmonitors 更复杂,仅通过 semaphore 来实现。我还发现这个链接非常有用:en.wikipedia.org/wiki/Condition_variable#Condition_variables
    【解决方案2】:

    Java 中的互斥锁(包括内在锁和 java.util.concurrent.Lock 形式)与事件通知机制很好地结合在一起。用信号量实现这样一个成熟的互斥量是有问题的:它需要释放一个信号量并以原子事务的形式获取另一个信号量。

    【讨论】:

    • 嗯,不确定你在说什么。我的意思是event notification mechanism。但无论如何,这些问题都是一般性的,与特定的编程语言无关。你明白我在说什么,你是否附上了mutexsemaphore在面向对象编程方面的含义和区别?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-28
    • 1970-01-01
    • 2015-05-31
    • 2017-07-10
    • 1970-01-01
    • 2010-10-01
    相关资源
    最近更新 更多