计算信号量还是互斥体?

Counting semaphore or Mutex?

本文关键字:信号量 计算      更新时间:2023-10-16

我有一个多线程应用程序,它有一个链表。代码中的很多地方都在遍历链表,但有一个地方删除了节点。遍历链表的位置不需要相互保护,即它们可以并行发生,但发生删除的位置需要发生在其他遍历位置都没有操作时。如果我有一个互斥锁并锁定所有位置 - 所有遍历位置和删除位置,它可以工作,但这会减慢整个应用程序的速度。我打算做的是,有一个变量(信号量),它会在遍历开始之前递增,在遍历结束时递减。增量和递减受互斥变量保护。删除位置将通过持有互斥变量 AND 当计数信号量为 0 时起作用(表示没有人遍历链表)。这行得通吗?这是设计这种情况的正确方法吗?有没有更好的方法?任何帮助,不胜感激。

蒂亚

您正在寻找一个读者/作家互斥体又名shared_mutex。 您可以实现它,使用 boost 和 C++14 或 C++17

相关问题:

  • 读写互斥锁/锁定如何工作?

  • 读取器/写入器锁定C++

正如其他人指出的那样,您应该使用读取器/写入器锁。不过,既然你对你提出的解决方案是否也有效感兴趣,那么答案是否定的。

在我解释原因之前,让我首先指出您错误地使用了术语"信号量"。根据您的描述,您似乎将一个简单的计数器变量称为"信号量",因为您不依赖于在信号量值为零时递减信号量阻塞。

无论如何,您的解决方案不起作用的主要原因是,您没有处理遇到非零计数器变量的编写器线程的策略,该变量表示正在进行一个或多个读取操作。那你的作家线程会怎么做?繁忙循环?