|
|
1
5
这实际上并不影响死锁的可能性。与独占锁相比,在存在可升级锁时允许共享锁只是可升级锁的一个功能。 让我们首先考虑一下可升级锁的用途。我们将设想以下情况:
现在,让我们考虑一下,我们只有reader(shared)/writer(exclusive)锁,没有可升级的锁:
检查-写入周期的读取部分甚至会阻塞读取线程,这可能被认为是一个缺点。因此,让我们考虑一个替代方案:
在3.到4.之间,可能有不止一个编写器完成了状态检查,因为它们可以同时进行检查,并且现在正在竞相获取独占锁。只有一个人能赢,其他人必须阻止。当他们封锁时,胜利者正在修改状态。 在这种情况下,等待获取独占锁的编写器不能再假设他们检查的条件是有效的!另一个作者可能在他们之前抢走了锁,现在状态已经被修改。他们可以忽略这一点,这可能会导致未定义的行为,具体取决于与条件和修改的关系。或者,他们可以在获得独占锁时再次检查条件,这会使我们返回到第一种方法,除非有可能因争用而无用的冗余检查。不管怎样,这种方法都比第一种方法差。 上述情况的解决方案是特权读取(可升级)锁:
|
|
AstralHex · 矩阵乘法代码工作不正常 1 年前 |
|
|
Fishie · 作为类成员的智能指针是否仍然自动释放?[关闭] 1 年前 |
|
|
Die4Toast · 递归调用成员箭头运算符-> 1 年前 |
|
|
Anka Hanım · 关于结构和动态数组地址的问题 1 年前 |