当所有者线程终止时,为什么ReaderWriterLock不会自动释放/退出?

时间:2010-02-10 18:38:06

标签: c# multithreading

这是一个理论问题;我没有要解决的实际问题,我只是想了解其工作方式背后的原因。

我发现如果一个线程省略退出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();
    }

2 个答案:

答案 0 :(得分:3)

简单的答案:作者线程没有简单的方法可以知道读取器线程已经终止,而且不会使锁定操作变得昂贵。

锁通常在内存中实现为值,因此获取释放锁涉及更改这些值。如果线程将值设置为获取锁,则崩溃,唯一可以获取另一个锁的方法是,如果您有一些后台线程轮询死线程,查看最近获取的锁列表,并清除它们。 / p>

除了价格昂贵且需要大量管道之外,它还可能不安全,因为你不知道线程在崩溃之前到底有多远。

答案 1 :(得分:0)

锁定存储独占的线程的标识或者非独占地保存它的线程列表可能不会太难。锁定代码然后可以在被阻止时定期检查以查看阻塞它的任何或所有线程是否仍然存活。这样做的最大问题是线程没有标准的方式来指示被锁保护的实体在何时处于合法状态或无效状态。如果持有锁的线程在受保护实体处于无效状态时死亡,则应禁止访问这些实体,除非或直到某些知道如何处理损坏的代码已经这样做。