c# - 为什么 ReaderWriterLock 在所有者线程终止时不自动释放/退出?

标签 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();
    }

最佳答案

简单的答案:没有简单的方法让写入线程知道读取线程已终止,同时又不会使锁定操作变得昂贵。

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

除了成本高昂且需要大量管道外,它还可能不安全,因为您无法确切知道线程在崩溃前执行了多远。

关于c# - 为什么 ReaderWriterLock 在所有者线程终止时不自动释放/退出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2239398/

相关文章:

multithreading - 进程是线程还是线程是进程?

python - 每 x 分钟创建一个 tkinter 窗口,然后在 y 秒后自动关闭它

multithreading - TParallel.For : Store values in a TList while they are calculated in a TParallel. For 循环

c# - 将TextBlock的文本设置为字符串加绑定(bind)项?

c# - 我在 EntityFramework 5 中找不到 System.Data.Entity.Validation

c# - 无法加载文件或程序集 'Newtonsoft.Json'

c# - 将多个 JSON 记录发送到 .NET Controller

c# - 无法从 soap c# SoapHttpClientProtocol 创建 SSL/TLS 安全通道

Java:多个线程同时读取同一个InputStream

c++ - 如何将两个值相乘并以原子方式存储结果?