6

ロックを解除すると、SynchronizationLockException が発生します。

もちろん、私が最初にしたことは、問題に関する Google 検索でした。私は 2 つの主な誤ったパターンを見つけました。

  1. 作成されたスレッドとは異なるスレッドで Mutex を解放します。
  2. モニターの同期オブジェクトとして値タイプを使用する。または、モニターの開始と終了の間で同期オブジェクトを変更します。

問題は、これらのパターンがどれも私のケースに当てはまらないことです。

非常に単純な同期シナリオがあります。

public class MyClass : IDisposable
{
    private readonly object _myLock = new object();

    internal void Func1()
    {
        lock (_myLock)
        {
            //Some code here
        }
    }

    internal void Func2()
    {
        lock (_myLock)
        {
            //Some code here
        }
    }

    public void Dispose()
    {
        lock (_myLock)
        {
            //Some code here
        }  // Here is where I get an exception
    }
}

最終的に、ロックが解除された場所SynchronizationLockExceptionの行を受け取ります。Dispose()

私の質問は、「私のコードの問題は何ですか」または「私が間違っていることは何ですか」ではありません。基本的に、ロックの.NET実装がこの例外をスローする可能性がある方法(およびどのような状況で)を知りたいです。

ありがとう。

4

1 に答える 1

0

新しい要素に合わせて基になる配列のサイズを変更しているときに、List インスタンスで SynchronizationLockException を取得したことがあります。List インスタンスは 3 つの異なるスレッドからアクセスされ、1 つのロックが失われました...

私は言います:スレッド同期を正しい方法で行っているかどうかをトリプルチェックしてください。

さらに、IDisposable パターンを正しい方法で実装します ( http://msdn.microsoft.com/en-us/library/fs2xkftw.aspxを参照)。ファイナライザーが頭を悩ませているのかもしれません。

于 2012-12-28T21:41:22.990 に答える