【发布时间】: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