计算信号量还是互斥体?
Counting semaphore or Mutex?
我有一个多线程应用程序,它有一个链表。代码中的很多地方都在遍历链表,但有一个地方删除了节点。遍历链表的位置不需要相互保护,即它们可以并行发生,但发生删除的位置需要发生在其他遍历位置都没有操作时。如果我有一个互斥锁并锁定所有位置 - 所有遍历位置和删除位置,它可以工作,但这会减慢整个应用程序的速度。我打算做的是,有一个变量(信号量),它会在遍历开始之前递增,在遍历结束时递减。增量和递减受互斥变量保护。删除位置将通过持有互斥变量 AND 当计数信号量为 0 时起作用(表示没有人遍历链表)。这行得通吗?这是设计这种情况的正确方法吗?有没有更好的方法?任何帮助,不胜感激。
蒂亚
您正在寻找一个读者/作家互斥体又名shared_mutex。 您可以实现它,使用 boost 和 C++14 或 C++17
相关问题:
-
读写互斥锁/锁定如何工作?
-
读取器/写入器锁定C++
正如其他人指出的那样,您应该使用读取器/写入器锁。不过,既然你对你提出的解决方案是否也有效感兴趣,那么答案是否定的。
在我解释原因之前,让我首先指出您错误地使用了术语"信号量"。根据您的描述,您似乎将一个简单的计数器变量称为"信号量",因为您不依赖于在信号量值为零时递减信号量阻塞。
无论如何,您的解决方案不起作用的主要原因是,您没有处理遇到非零计数器变量的编写器线程的策略,该变量表示正在进行一个或多个读取操作。那你的作家线程会怎么做?繁忙循环?
相关文章:
- 犰狳C++:带有模量计算的线性组合
- 删除旧的信号量系统V
- boost::序列化中的派生类偏移量计算.有效吗?
- 父进程和子进程之间的 POSIX 信号量
- 访问共享内存而不使用易失性、std::atomic、信号量、互斥锁和自旋锁
- 多线程.如果我使用信号量,我可以在开始时创建很多线程还是应该只有几个线程?
- C/C++ - 用于按顺序打印数字的 sem_t 类型的单个信号量
- 单车道桥 使用信号量进行同步
- 用于 64 位/32 位 IPC 的 POSIX 信号量的替代方案?
- 这个餐饮哲学家问题(dpp)的解决方案是如何工作的?互斥体和信号量
- 发布信号量返回错误 6(无效句柄)
- 在 C Linux 中使用三个线程使用信号量同步按顺序打印 3 4 5 50 次
- 在使用 pthread 和信号量实现生产者-消费者问题时需要帮助
- 如何让一个线程继续,而另一个线程正在等待C++中的信号量
- 实现信号量
- 计算信号量还是互斥体?
- POSIX 信号量在高争用/负载下不起作用
- C++:提升:托管共享内存是否需要信号量锁
- 信号量的问题
- 如何使用Windows API直接将进程"assign"到信号量?