Я очень хорошо знаком с ReaderWriterLockSlim
, но недавно попытался реализовать EnterUpgradeableReadLock()
в классе... Вскоре после того, как я понял, что это почти наверняка гарантированный тупик, когда два или более потока запускают код:
Thread A --> enter upgradeable read lock
Thread B --> enter upgradeable read lock
Thread A --> tries to enter write lock, blocks for B to leave read
Thread B --> tries to enter write lock, blocks for A to leave read
Thread A --> waiting for B to exit read lock
Thread B --> waiting for A to exit read lock
Что мне здесь не хватает?
ИЗМЕНИТЬ
Добавлен пример кода моего сценария. Метод Run()
будет вызываться двумя или более потоками одновременно.
public class Deadlocker
{
private readonly ReaderWriterLockSlim _lock = new ReaderWriterLockSlim(LockRecursionPolicy.SupportsRecursion);
public void Run()
{
_lock.EnterUpgradeableReadLock();
try
{
_lock.EnterWriteLock();
try
{
// Do something
}
finally
{
_lock.ExitWriteLock();
}
}
finally
{
_lock.ExitUpgradeableReadLock();
}
}
}