【问题标题】:How does a mutex lock work?互斥锁是如何工作的?
【发布时间】:2026-02-01 20:00:01
【问题描述】:

我目前正在研究互斥锁的工作原理。我想我有点掌握它。我在图片下方的假设是否正确?这里我们有两个进程 Pi 和 Pj 想要执行它们的临界区,我试图解释互斥锁如何工作以防止发生竞争条件。

Pi 尝试使用 acquire() 获取锁。一开始,没有进程正在执行其临界区,因此可用将是真的。在 acquire 的 while 循环中,条件为 false,不会“忙等待”,available 将设置为 false。将available设置为false的原因是为了防止其他进程进入它们的临界区。另一方面,Pj 不允许执行其临界区,因为可用被 Pi 设置为 false。 !available 为真,因此 Pj 将陷入“忙等待”。

一旦 Pi 完成其临界区的执行,它就会调用 release()。 release 方法将可用的布尔变量重置为 true。一旦available 设置为true,Pj 将停止“忙等待”,因为现在!availale 将给出一个false 值。 Pj 将设置为 false 并执行其临界区。该循环会重复自己,以便下一个想要获取锁以执行其临界区的进程

【问题讨论】:

    标签: mutex


    【解决方案1】:

    你的解释是正确的,但不要太担心acquire()的实现。

    首先,acquire() 的这个实现在available 上有一个竞争条件。

    此代码只是一个示例,用于说明互斥体(在本例中为spinlock)的用法,并简要介绍了实现的细节。

    【讨论】:

    • 感谢您的反馈。
    【解决方案2】:

    上面实现的锁有点类似于自旋锁,只是它应该使用CAS(compare-and-swap)原子操作来保证正确性。实现 mutex acquire() 的总体思路是:

    1. 检查互斥量是否可用
    2. 如果可用,则将互斥锁标记为已使用。否则,在互斥锁释放后调度程序再次运行线程之前让步。

    【讨论】:

    • 感谢您的反馈。