作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我很熟悉ReaderWriterLockSlim
但尝试实现 EnterUpgradeableReadLock()
最近在一个类(class)......不久之后我意识到当 2 个或更多线程运行代码时,这几乎肯定是一个有保证的死锁:
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()
方法将被 2 个或更多线程同时调用。
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();
}
}
}
最佳答案
在 OP 之后很长一段时间,但我不同意目前接受的答案。
声明Thread B --> enter upgradeable read lock
是不正确的。来自 the docs
Only one thread can be in upgradeable mode at any time
// no other writers or upgradeables allowed in here => no race conditions
EnterUpgradeableLock();
if (isWriteRequired()) { EnterWriteLock(); DoWrite(); ExitWriteLock(); }
ExitUpgradeableLock();
EnterWriteLock(); if (isWriteRequired()) { DoWrite(); } ExitWriteLock();
e
enter;
w
wait;
x
exit;
cr
检查资源;
mr
变异资源;
R
共享/读取;
U
意图/可升级;
W
独占/写入):
1--eU--cr--wW----eW--mr--xWxU--------------
2------eR----xR----------------eR--xR------
3--------eR----xR--------------------------
4----wU----------------------eU--cr--xU----
writelock-check-nowrite-exit
大约为零(写入条件检查非常快)-即 Upgradeable 构造不会帮助 Reader 吞吐量; ReadLock-Check-WriteLock-DoubleCheck
如此之快,每万亿次写入只会导致一次竞赛失败; lock(...){...}
也不需要更合适,即:
关于c# - ReaderWriterLockSlim.EnterUpgradeableReadLock() 总是死锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21411018/
我很熟悉ReaderWriterLockSlim但尝试实现 EnterUpgradeableReadLock()最近在一个类(class)......不久之后我意识到当 2 个或更多线程运行代码时,这
当我阅读 C# 多线程时,我对 EnterReadLock 和 EnterUpgradeableReadLock 之间的区别感到困惑在下面的代码中,是否可以将 cacheLock.EnterUpgra
所以我遇到这样一种情况,我可能有很多很多读取,只是偶尔写入多个线程共享的资源。 很久以前,我阅读了关于 ReaderWriterLock 的内容,并且阅读了关于 ReaderWriterGate 的内
我是一名优秀的程序员,十分优秀!