当前位置: 首页 > 知识库问答 >
问题:

第二个读卡器写卡器的问题-为什么读卡器需要第三个互斥锁

郎俊雅
2023-03-14

我不明白在第二个readers-writer问题的通用解决方案中,在reader过程的最开始使用最外层互斥的目的是什么。

为了说明这一点,我将从适当的维基百科条目(链接)中发布一个代码。我说的是mutex_3:

READER
  P(mutex_3);
    P(r);
      P(mutex_1);
        readcount := readcount + 1;
        if readcount = 1 then P(w);
      V(mutex_1);
    V(r);
  V(mutex_3);

  reading is performed

  P(mutex_1);
    readcount := readcount - 1;
    if readcount = 0 then V(w);
  V(mutex_1);

我能想到的唯一答案是,这有助于阻止新读者的涌入。但我认为,除了它的核心功能外,下一个互斥锁,即r,已经完成了。我错了吗?

共有1个答案

暴招
2023-03-14

我知道这个问题很久以前就被问过了,但我想我还是会把答案贴出来,以防将来对其他人有所帮助。

我们使用互斥体来保护共享资源不被多个线程同时访问。在mutex_3的情况下,如果您查看紧跟在P(mutex_3)之后的代码,我们会看到我们想要保护的共享资源是信号量r。因此,具有mutex_3可以确保在任何时候只有一个读取器可以执行P(r)和V(r)之间的代码段。

要了解为什么互斥体是重要的,我们还需要考虑编写器的代码。来自维基百科:

作家

P(mutex_2);
 writecount := writecount + 1;
 if writecount = 1 then **P(r)**;  <-- Writer waits on semaphore r
V(mutex_2);

P(w);
 writing is performed
V(w);

P(mutex_2);
 writecount := writecount - 1;
 if writecount = 0 then V(r);
V(mutex_2);

需要注意的关键部分是粗体。如您所见,编写器和读取器都在信号量r上调用P(r)。在本例中,不清楚谁的调用首先成功。我们假设编写器在调用P(r)时没有任何优先级(如果有,则不需要互斥3)。

然而,针对第二个读者-作者问题的问题陈述指出,作者应该尽快开始写作。如果调度是在先到先得的基础上进行的,那么在上述情况下,如果读取器设法首先调用P(r),则读取器的调用成功。然后作者被耽搁了,这是我们不希望的。

因此,解决方案是在阅读器的设置代码周围放置一个互斥锁(mutex_3)。现在,当一个阅读器调用V(r)时,不能有任何其他阅读器等待r,因为其他阅读器需要在能够调用P(r)之前获得mutex_3,但是当前阅读器持有mutex_3!然而,可以有一个写作者在等待r,所以在这种情况下,写作者对P(r)的调用总是尽快成功,因为它是唯一等待r的写作者。

 类似资料:
  • 问题内容: 我有一个IC接触式读卡器和SLE5528智能卡。想知道如何真正开始使用这些物品。 正在读取读取器,插入智能卡后看不到任何影响。 我还从http://www.openscdp.org/安装了opensmart的智能卡外壳 但是我不能用它来读任何读卡器。我想知道它是否有兼容性问题。 请我知道我可能不恰当地提出了这个问题,但是请那里的任何人帮助我。 任何相关的链接或有用的信息都可以帮助我入门

  • HCE是在Android 4.4中实现的,但是关于如何在模拟卡中写入的信息很少。 我有心肺复苏40.30阅读器 这个读者带来了一些样本NFC卡。我使用NFC读卡应用程序读取这些卡。 与CPR 40.30兼容的NFC卡详细信息 IC制造商:恩智浦半导体 我想写HCE代码,希望我的Android手机像一张卡片一样,可以被CPR 40.30阅读器读取。我假设HCE代码应该模拟具有上述规格的卡,因为读卡器

  • 我正在尝试使用NFC读卡器库读取Mifare超轻型卡的内容。 我对NFC完全陌生,我正在使用这个github存储库开始。 此存储库中的代码允许检测检测到哪种类型的卡(Mifare,Mifare超轻量级......)并读取卡的UID。我添加了以下代码以读取Mifare超轻型卡的内容: 我有一张卡片,上面写着“Hello world”,当我读到它时,上面的代码会打印以下字节: 所以我从我的卡片上读了一

  • 我开发了一个系统,可以使用带有PN532芯片的阅读器读取NFC标签。它工作正常。我可以阅读米费尔经典和米费尔超轻标签。 现在我想使用带有Android 4.4.2的Nexus平板电脑来模拟标签。我没有Android开发经验,但我认为这是可能的。 我已经在Nexus平板电脑中设置了NFC通信,但我想我必须下载或编写一些应用程序来模拟Tag和NDEF通信。 最简单的方法是什么?

  • 我们希望我们的Redis更具可扩展性,并且能够添加更多的读取实例。 我正在尝试使用此新的读卡器endpoint:https://aws.amazon.com/about-aws/whats-new/2019/06/amazon-elasticache-launches-reader-endpoint-for-redis 但是,我没有看到使用这种方法的任何简单或自动的方法,我可以设置哪个endpoi

  • 我想编写一个Android Studio IDE插件,它将在XML文件编辑器视图中添加第三个选项卡(在“设计”和“文本”选项卡之后)。 我试图完成的是对布局XML文件进行不同的表示。 我试着翻阅这一页下面的文件,但找不到任何有用的东西。 有人能帮我吗? 我已经完成了IntelliJ插件的创建过程。但由于我正在Android的插件之上构建一个插件,所以我找不到任何好的起点。如果有人能给我指出XML布