【问题标题】:Multiple ReaderWriterLockSlim on a Resource资源上有多个 ReaderWriterLockSlim
【发布时间】:2015-07-20 16:08:59
【问题描述】:

ReaderWriterLockSlim 允许使用锁来管理对资源的访问,允许多个线程进行读取或独占访问写入。目前我们有以下代码:

public ReaderWriterLockSlim protDataA = new ReaderWriterLockSlim(LockRecursionPolicy.SupportsRecursion);
        public ReaderWriterLockSlim protDataB = new ReaderWriterLockSlim(LockRecursionPolicy.SupportsRecursion);
        public void AMethod(ClassA Aobject )
        {
            try
            {
                protDataA.EnterWriteLock();
                //change A-typed-object
            }
            finally
            { protDataA.ExitWriteLock(); }
        }
        public void BMethod(ClassB Bobject)
        {
            try
            {
                protDataB.EnterWriteLock();
                //change B-typed-object
            }
            finally
            { protDataB.ExitWriteLock(); }
        }

现在,如果我需要保护 A 和 B 类型对象的数据,应该采用什么方法以及为什么?

//Approach-1 - Making multiple locks on a single block
public void ABMethod(ClassA Aobject, ClassB Bobject)
            {
                try
                {
                    protDataA.EnterWriteLock();
                    protDataB.EnterWriteLock();
                    //change A-typed-object
                    //change B-typed-object
                }
                finally
                {
                    protDataA.ExitWriteLock();
                    protDataB.ExitWriteLock();
                }
            }

    //Approach-2 - Or Making a single lock would serve the same purpose ?
            public void ABMethod(ClassA Aobject, ClassB Bobject)
            {
                try
                {
                    protDataA.EnterWriteLock();
                    //change A-typed-object
                    //change B-typed-object
                }
                finally
                {
                    protDataA.ExitWriteLock();
                }
            }

【问题讨论】:

  • 如果我打电话给BMethodABMethod 的第二种方法,什么会阻止两者同时写入?另外,你真的需要同时打开两个锁吗?你可以先拿一个做你需要的然后再拿另一个吗?
  • @ScottChamberlain ,您是否建议在所有 3 种方法(AMethod、BMethod、ABMethod)中将两个锁定对象 protDataA 和 protDataB 替换为单个锁定对象?即使 A 对象发生变化,线程也会等待访问 B 对象。

标签: c# multithreading thread-safety locking readerwriterlockslim


【解决方案1】:

这两种方法都很好。选择最好的一个需要了解锁的其他用法:锁的频率、锁的时间等。

在出现一定的性能瓶颈(通过分析发现)之前,首选第二种(单锁)方法:它永远不会出现死锁,因此您编写错误代码的机会较低。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多