C++ 为什么共享锁只能持有一个可升级锁
表示当持有共享锁时,只有另一个线程可以获得可升级的锁。这样,当共享锁与可升级锁一起持有时,如果其他线程试图获取可升级锁,它们将阻塞 当多个线程与一个(或多个共享锁)一起获取可升级锁时,是否存在我丢失的死锁可能性?或者这仅仅是一个逻辑要求(所以“不应该这样做”之类的事情) 请注意,我所说的不是完全锁定的状态。只有可升级的锁定状态。如果一个可升级锁与其他共享锁一起持有,那么它本质上就是一个读锁。那为什么两个可升级的锁不能连在一起呢 当多个线程获取可升级的锁时,是否存在我丢失的死锁可能性 TL;是的,有 以及一个(或多个共享锁) 这实际上并不影响死锁的可能性。与独占锁相比,在存在可升级锁的情况下允许共享锁只是可升级锁的一个特性C++ 为什么共享锁只能持有一个可升级锁,c++,multithreading,c++11,boost,mutex,C++,Multithreading,C++11,Boost,Mutex,表示当持有共享锁时,只有另一个线程可以获得可升级的锁。这样,当共享锁与可升级锁一起持有时,如果其他线程试图获取可升级锁,它们将阻塞 当多个线程与一个(或多个共享锁)一起获取可升级锁时,是否存在我丢失的死锁可能性?或者这仅仅是一个逻辑要求(所以“不应该这样做”之类的事情) 请注意,我所说的不是完全锁定的状态。只有可升级的锁定状态。如果一个可升级锁与其他共享锁一起持有,那么它本质上就是一个读锁。那为什么两个可升级的锁不能连在一起呢 当多个线程获取可升级的锁时,是否存在我丢失的死锁可能性 TL;是的,
让我们先考虑可升级的锁可以使用什么。我们将设想以下情况:
- 多个写入线程必须检查一个条件(读取操作),然后根据该条件修改状态
- 检查病情是昂贵的
- 这个条件很少得到满足
- 其他线程也读取状态
现在,让我们考虑我们只有阅读器(共享)/写入器(独占)锁,没有可升级的锁:
上述情况的解决方案是特权读取(可升级)锁:
让我们考虑多个作家被授予特权锁的情况。他们可以同时检查昂贵的条件,这很好,但他们仍然在竞争升级锁。这一次,竞争导致死锁,因为每个写入程序都持有读锁,并等待所有读锁释放后才能升级
如果可升级的锁相对于其他可升级的锁是独占的,那么这个死锁就不会发生,并且昂贵的检查和修改之间不存在竞争,但是,当作者检查时,读卡器线程仍可能运行。@downvoter请解释我可以做些什么来改进此问题?一旦我发现我提出的问题不适用于此,我将立即删除此问题。这是一个明显的问题吗?有人能解释一下为什么我会得到这么多的反对票吗?在这个问题上有这么多的争议。你说的“如果升级锁是其他升级锁所独有的”是什么意思?你的意思是说只有一个可升级的锁和其他读卡器锁一起存在吗?@好奇的是。我现在在那句话中加上了“关于”。结果证明,解决办法很简单!我不知道为什么我不能早点想到。。