这是一个理论问题;我没有要解决的实际问题,我只想了解其工作方式背后的原因。
我发现,如果一个线程没有退出 ReaderWriterLock,那么即使在原始线程终止后,其他线程也无法获取锁。拥有锁的线程终止后,ReaderWriterLock 不立即将锁授予等待线程是否有充分的理由?
这是一个演示问题的测试用例。
static void Main(string[] args)
{
ReaderWriterLockSlim readerWriterLock = new ReaderWriterLockSlim();
Thread t1 = new Thread((a) =>
{
readerWriterLock.EnterReadLock();
// this thread omits to Exit the lock....
});
Thread t2 = new Thread((a) =>
{
readerWriterLock.EnterWriteLock();
});
t1.Start();
t2.Start();
// wait for all threads to finish
t1.Join();
t2.Join();
}
最佳答案
简单的答案:没有简单的方法让写入线程知道读取线程已终止,同时又不会使锁定操作变得昂贵。
锁通常作为内存中的值来实现,因此获取和释放锁涉及更改这些值。如果一个线程设置了获取锁的值,然后崩溃,获取另一个锁的唯一方法是如果你有一些后台线程轮询死线程,查看它们最近获取的锁列表,并清理它们。
除了成本高昂且需要大量管道外,它还可能不安全,因为您无法确切知道线程在崩溃前执行了多远。
关于c# - 为什么 ReaderWriterLock 在所有者线程终止时不自动释放/退出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2239398/