0

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

1 に答える 1

1

どちらのアプローチも優れています。最適なものを選択するには、ロックの他の使用方法 (ロックされる頻度、ロックされる期間など) に関する知識が必要です。

特定のパフォーマンスのボトルネック (プロファイリングによって発見される) が発生するまでは、2 番目の (単一ロック) アプローチが推奨されます。デッドロックに悩まされることはないため、バグのあるコードを作成する可能性が低くなります。

于 2015-07-20T22:18:06.643 に答える