【问题标题】:What happens to a thread when an up is done on its mutex?当对其互斥体执行 up 时,线程会发生什么?
【发布时间】:2011-03-17 22:15:02
【问题描述】:

互斥锁用于保护临界区。假设已经对互斥体执行了向下操作,而执行该操作的线程在 CS 中,其他 10 个线程紧随其后,对互斥体执行向下操作,使自己进入睡眠状态。当第一个线程退出临界区并在互斥体上执行 up 时,是否所有 10 个线程都唤醒并恢复它们将要执行的操作,即进入临界区?那不是意味着所有 10 个可能同时进入临界区吗?

【问题讨论】:

    标签: multithreading thread-safety mutex critical-section


    【解决方案1】:

    不,只有 一个 线程会唤醒并获得互斥锁的所有权。其余的人将保持睡眠状态。哪个线程被唤醒通常是不确定的。

    以上是一个概括,每个系统的实现细节会有所不同。例如,在 Java 中比较 Object#notify()Object#notifyAll()

    【讨论】:

    • 当那个线程被唤醒时,它是否会继续它在睡觉前要做的下一件事?
    • 接下来要做的是获取互斥锁。如果互斥锁可用并且在此期间还没有被其他东西获取(这可能发生),那么是的,它会唤醒并继续它正在做的任何事情。
    • 当多个进程关闭一个互斥体时,它的值是否低于 0?它的值可以是 0 或 1 以外的任何值吗?
    • @z-buffer:“值”是考虑互斥锁的概念性方式,给定的实现可能有也可能没有与互斥锁关联的数值。在任何给定时间,只有一个线程可以获取并持有互斥锁。从概念上讲,这可能意味着该互斥体的“值”只能是 0 或 1。
    猜你喜欢
    • 1970-01-01
    • 2017-02-20
    • 1970-01-01
    • 2019-11-15
    • 2017-11-18
    • 1970-01-01
    • 2013-10-13
    • 1970-01-01
    • 2011-09-25
    相关资源
    最近更新 更多