Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 计算信号量还是互斥量?_C++_Multithreading_Algorithm - Fatal编程技术网

C++ 计算信号量还是互斥量?

C++ 计算信号量还是互斥量?,c++,multithreading,algorithm,C++,Multithreading,Algorithm,我有一个多线程应用程序,它有一个链表。代码中有很多地方都在遍历链表,但有一个地方删除了节点。遍历链表的位置不需要相互保护,也就是说,它们可以并行进行,但是当其他遍历位置都不起作用时,需要删除链表的位置。如果我有一个互斥锁并锁定所有位置——包括所有遍历位置和删除位置,它会工作,但这会降低整个应用程序的速度。我计划做的是,有一个变量(信号量),它将在遍历开始前递增,在遍历结束时递减。增量和减量由互斥变量保护。当计数信号量为0(表示没有人在遍历链表)时,delete place将通过保持互斥变量来工作

我有一个多线程应用程序,它有一个链表。代码中有很多地方都在遍历链表,但有一个地方删除了节点。遍历链表的位置不需要相互保护,也就是说,它们可以并行进行,但是当其他遍历位置都不起作用时,需要删除链表的位置。如果我有一个互斥锁并锁定所有位置——包括所有遍历位置和删除位置,它会工作,但这会降低整个应用程序的速度。我计划做的是,有一个变量(信号量),它将在遍历开始前递增,在遍历结束时递减。增量和减量由互斥变量保护。当计数信号量为0(表示没有人在遍历链表)时,delete place将通过保持互斥变量来工作。这样行吗?这是设计这种情况的正确方法吗?有更好的方法吗?感谢您的帮助


TIA

您正在寻找一个读写互斥体,即共享互斥体。 您可以实现它,或者使用它

有关问题:


您正在寻找一个读写互斥体,即共享互斥体。 您可以实现它,或者使用它

有关问题:


正如其他人所指出的,您应该使用读写器锁。尽管如此,由于您对所提出的解决方案是否也能起作用感兴趣,因此答案是否定的

在解释原因之前,让我首先指出您使用的术语“信号量”不正确。根据您的描述,看起来您正在将一个简单的计数器变量称为“信号量”,因为您不依赖于在信号量值为零时减少信号量阻塞


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

正如其他人所指出的,您应该使用读写器锁。尽管如此,由于您对所提出的解决方案是否也能起作用感兴趣,因此答案是否定的

在解释原因之前,让我首先指出您使用的术语“信号量”不正确。根据您的描述,看起来您正在将一个简单的计数器变量称为“信号量”,因为您不依赖于在信号量值为零时减少信号量阻塞


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

谢谢!真管用!但我想知道我提出的解决方案是否可行?我看到读写器锁是使用互斥锁和信号实现的,我的解决方案看起来非常简单。行吗?谢谢!真管用!但我想知道我提出的解决方案是否可行?我看到读写器锁是使用互斥锁和信号实现的,我的解决方案看起来非常简单。行吗?谢谢你!读卡器线程只是增加计数器(在被锁定时,在计数器增加后释放计数器)。writer是一个后台作业,如果计数器不为零,它将返回。下一次它回来时,它将完成它的工作,它不会阻止任何东西。如果可能的话,写入程序(节点删除)在它进入时执行该作业,否则在下次进入时就返回执行该作业(他对延迟很好)。我同意,这对作者来说不是很有效,但是你仍然认为它不起作用吗?只是学习,所以想知道。谢谢@user7795930如果在读访问正在进行的情况下跳过写访问是可以接受的,那么是的,您的解决方案应该可以工作。这就像在不使用锁的情况下使用std::shared\u mutex
lock()
而使用锁的情况下使用
try\u lock()
。谢谢!读卡器线程只是增加计数器(在被锁定时,在计数器增加后释放计数器)。writer是一个后台作业,如果计数器不为零,它将返回。下一次它回来时,它将完成它的工作,它不会阻止任何东西。如果可能的话,写入程序(节点删除)在它进入时执行该作业,否则在下次进入时就返回执行该作业(他对延迟很好)。我同意,这对作者来说不是很有效,但是你仍然认为它不起作用吗?只是学习,所以想知道。谢谢@user7795930如果在读访问正在进行的情况下跳过写访问是可以接受的,那么是的,您的解决方案应该可以工作。这就像在不使用锁的情况下实现std::shared_mutex,而使用锁的情况下实现
try_lock()