gpt4 book ai didi

multithreading - 升级锁如何帮助避免读写器锁死锁

转载 作者:行者123 更新时间:2023-12-03 13:12:41 24 4
gpt4 key购买 nike

我知道升级锁试图解决经典的死锁示例,其中两个并发线程同时保持读取锁并尝试获取写锁将导致死锁。

Thread A: S lock (acquired)

Thread B: S lock (acquired)

Thread A: X lock (waiting for B to release S lock)

Thread B: X lock (waiting for A to release S lock) DEADLOCKED



为什么同样的问题不在于升级锁? This文档说,只有一个线程可以被授予升级锁,而其他线程仍保持S锁时,可以这样做。有人可以解释为什么运行此模式的两个并发线程不会陷入死锁吗?
  lock.AcquireSharedLock()      // Thread A and B both acquired this S lock

lock.EnterUpgradeableReadLock(); // Only one (e.g. A) acquired U lock and other (e.g. B) is blocked here.

if(somecondition)
{
lock.AcquireExclusiveLock(); // A tries to acquire X lock. But wouldn't it get blocked since B is already holding onto S lock? B is already blocked, so this has to be a deadlock
}

最佳答案

有趣的是,我刚刚针对SQL Server和UPDATE语句回答了相同的问题:How do UPDATE locks prevent a common form of deadlock?

答案的关键方面是,可升级的事务永远不会采用S锁。他们立即U锁。因此,S锁和X锁之间永远不会发生冲突。

在您的示例中,

lock.AcquireSharedLock()

不应该存在。您可以使用S锁或U锁。不是按顺序的,而是它们中的任何一个。

关于multithreading - 升级锁如何帮助避免读写器锁死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22341993/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com