互斥锁如何工作?

时间:2017-10-16 02:47:05

标签: mutex

我目前正在研究互斥锁是如何工作的。我觉得我有点抓住它。我的假设低于图像是否正确?这里我们有两个进程,Pi和Pj,它们想要执行它们的关键部分,我试着解释一个互斥锁是如何工作来防止竞争条件发生的。

enter image description here

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

一旦Pi完成执行其关键部分,它就会调用release()。 release方法重置true可用的布尔变量。一旦可用设置为true,Pj将停止“忙等待”,因为现在!availablele将给出错误值。 Pj将设置为false并执行其关键部分。循环为下一个想要获取锁定以执行其关键部分

的过程重复进行

2 个答案:

答案 0 :(得分:1)

您的解释是正确的,但不要过于担心acquire()的实施。

首先,acquire()的此实施在available上有竞争条件。

此代码仅用于说明互斥锁的用法(在本例中为spinlock),并浏览实现的详细信息。

答案 1 :(得分:1)

上面实现的锁有点类似于自旋锁,除了它应该使用CAS(比较和交换)原子操作来保证正确性。实现互斥式acquire()的一般想法是:

  1. 检查互斥锁是否可用
  2. 如果可用,请将互斥锁标记为已使用。否则,直到调度程序在释放互斥锁后再次运行线程时才产生。