Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.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_C++11_Boost_Mutex - Fatal编程技术网

C++ 为什么共享锁只能持有一个可升级锁

C++ 为什么共享锁只能持有一个可升级锁,c++,multithreading,c++11,boost,mutex,C++,Multithreading,C++11,Boost,Mutex,表示当持有共享锁时,只有另一个线程可以获得可升级的锁。这样,当共享锁与可升级锁一起持有时,如果其他线程试图获取可升级锁,它们将阻塞 当多个线程与一个(或多个共享锁)一起获取可升级锁时,是否存在我丢失的死锁可能性?或者这仅仅是一个逻辑要求(所以“不应该这样做”之类的事情) 请注意,我所说的不是完全锁定的状态。只有可升级的锁定状态。如果一个可升级锁与其他共享锁一起持有,那么它本质上就是一个读锁。那为什么两个可升级的锁不能连在一起呢 当多个线程获取可升级的锁时,是否存在我丢失的死锁可能性 TL;是的,

表示当持有共享锁时,只有另一个线程可以获得可升级的锁。这样,当共享锁与可升级锁一起持有时,如果其他线程试图获取可升级锁,它们将阻塞

当多个线程与一个(或多个共享锁)一起获取可升级锁时,是否存在我丢失的死锁可能性?或者这仅仅是一个逻辑要求(所以“不应该这样做”之类的事情)

请注意,我所说的不是完全锁定的状态。只有可升级的锁定状态。如果一个可升级锁与其他共享锁一起持有,那么它本质上就是一个读锁。那为什么两个可升级的锁不能连在一起呢

当多个线程获取可升级的锁时,是否存在我丢失的死锁可能性

TL;是的,有

以及一个(或多个共享锁)

这实际上并不影响死锁的可能性。与独占锁相比,在存在可升级锁的情况下允许共享锁只是可升级锁的一个特性


让我们先考虑可升级的锁可以使用什么。我们将设想以下情况:

  • 多个写入线程必须检查一个条件(读取操作),然后根据该条件修改状态
  • 检查病情是昂贵的
  • 这个条件很少得到满足
  • 其他线程也读取状态

现在,让我们考虑我们只有阅读器(共享)/写入器(独占)锁,没有可升级的锁:

  • Writer获取独占锁,并开始检查条件
  • 其他线程必须在昂贵的检查操作运行时阻塞,即使它们只需要读取
  • 检查-写入周期的读取部分甚至会阻塞读取线程,这可能被认为是一个缺点。因此,让我们考虑另一种选择:

  • Writer获取一个共享锁,并开始检查条件
  • 其他线程也可以使用共享锁
  • 写入程序已检查该条件,并释放读取锁
  • 条件已满足,编写器现在尝试使用独占锁继续
  • 三点之间。四,。可能不止一个编写器已经完成了状态检查——因为他们可以同时检查——现在正竞相获取独占锁。只有一个人能赢,其他人必须阻止。当他们阻塞时,赢家正在修改状态

    在这种情况下,等待获取独占锁的写入程序不能再假定他们检查的条件有效!另一个编写器可能在他们之前抓到了锁,并且状态现在已被修改。他们可以忽略这一点,这可能导致未定义的行为,这取决于与条件和修改的关系。或者,当他们获得独占锁时,他们可以再次检查条件,这会使我们回到第一种方法,但由于竞争而无效的潜在冗余检查除外。无论如何,这种方法比第一种方法更糟糕


    上述情况的解决方案是特权读取(可升级)锁:

  • Writer获取一个特权锁,并开始检查条件
  • 其他线程可能使用共享锁
  • 写入程序已检查满足的条件,并升级到独占锁(必须阻止,直到其他锁被释放)
  • 让我们考虑多个作家被授予特权锁的情况。他们可以同时检查昂贵的条件,这很好,但他们仍然在竞争升级锁。这一次,竞争导致死锁,因为每个写入程序都持有读锁,并等待所有读锁释放后才能升级


    如果可升级的锁相对于其他可升级的锁是独占的,那么这个死锁就不会发生,并且昂贵的检查和修改之间不存在竞争,但是,当作者检查时,读卡器线程仍可能运行。

    @downvoter请解释我可以做些什么来改进此问题?一旦我发现我提出的问题不适用于此,我将立即删除此问题。这是一个明显的问题吗?有人能解释一下为什么我会得到这么多的反对票吗?在这个问题上有这么多的争议。你说的“如果升级锁是其他升级锁所独有的”是什么意思?你的意思是说只有一个可升级的锁和其他读卡器锁一起存在吗?@好奇的是。我现在在那句话中加上了“关于”。结果证明,解决办法很简单!我不知道为什么我不能早点想到。。