首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么当拥有者线程终止时,ReaderWriterLock不会自动释放/退出?

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

Stack Overflow用户
提问于 2010-02-11 02:38:06
回答 2查看 497关注 0票数 3

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

我发现,如果一个线程忽略退出ReaderWriterLock,那么其他线程即使在原始线程终止后也无法获得锁。当拥有锁的线程终止时,ReaderWriterLock为什么不立即将锁授予等待的线程,这有什么好的原因吗?

以下是演示该问题的测试用例。

代码语言:javascript
复制
    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();
    }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-02-11 02:45:43

简单的答案是:没有简单的方法让写线程知道读线程已经终止,而不会增加锁定操作的开销。

锁通常实现为内存中的值,因此获取和释放锁涉及更改这些值。如果一个线程设置了获取锁的值,然后崩溃,那么获取另一个锁的唯一方法就是让一些后台线程轮询死线程,查看它们最近获取的锁的列表,并清除它们。

除此之外,这是昂贵的,需要大量的管道,它可能是不安全的,因为您不知道线程在崩溃之前到底走了多远。

票数 3
EN

Stack Overflow用户

发布于 2011-04-12 04:40:42

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2239398

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档