【问题标题】:How upgrade lock helps avoid deadlock in reader/writer lock升级锁如何帮助避免读/写锁死锁
【发布时间】:2014-03-12 04:22:09
【问题描述】:

我了解升级锁试图解决经典的死锁示例,其中两个并发线程持有读锁并尝试获取写锁会死锁。

线程 A:S 锁(已获得)

线程 B:S 锁(已获得)

线程A:X锁(等待B释放S锁)

线程B:X锁(等待A释放S锁)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
  }

【问题讨论】:

标签: multithreading concurrency


【解决方案1】:

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

答案的关键在于可升级事务从不使用 S 锁。他们立即U-lock。因此,S-lock 和 X-lock 之间永远不会发生冲突。

在你的例子中,

lock.AcquireSharedLock()

永远不应该存在。你要么 S-lock U-lock。不是按顺序,而是按顺序。

【讨论】:

  • 我了解 U 锁是从交易开始时获取的。假设事务 A 持有 U 锁,事务 B 持有 S 锁。后来他们写。但是当A开始获取X锁而B也想获取X锁时,那不还是死锁吗?
猜你喜欢
  • 1970-01-01
  • 2011-01-25
  • 1970-01-01
  • 1970-01-01
  • 2013-06-07
  • 2012-08-14
  • 1970-01-01
  • 1970-01-01
  • 2017-12-17
相关资源
最近更新 更多