3

.net の Lock() コンストラクトに関する 2 つの質問

まず、あるクラス内でオブジェクトがロックされていて、別のクラスが同じオブジェクトをロックしようとすると、デッドロックが発生することを認識しています。しかし、なぜ?MSDNでそれについて読んだことがありますが、MSDNがそれほど明確であることはめったにありません。

----質問 1 を編集---- まだ混乱しています。多くの Threadpool スレッドを生成するメイン スレッド (UI スレッド) があります。各子スレッドは、データを操作する前にデータをロックします。これは毎回うまくいきます。

次に、UI スレッドから同じデータをロックして、エッジ ケース用に新しいスレッドを作成する必要があるかどうかを確認しようとすると、ほぼ毎回デッドロックが発生します。

----質問 2 を編集---- 第二に、ロックした複合オブジェクトがある場合、その中のすべての子オブジェクトもロックされますか? 短いコードのデモ:

internal sealed class Update
{
    //Three objects instantiated via other external assemblies
    public DataObject One { get; set; }
    public DataObject Two { get; set; }
    public ReplayStatus Status { get; set; }
}

lock(UpdateObject) を呼び出すと、3 つの内部オブジェクトのそれぞれと、そこにあるすべての子オブジェクトもロックされますか?

したがって、スレッドがデータ オブジェクトを操作しないようにするには、次のようにする必要があります。

Lock(UpdateObject.One)
{
    Lock(UpdateObject.Two)
    {
        Lock(UpdateObject.Status)
        {
            //Do Stuff
        }
    }
} 
4

2 に答える 2

5

まず、あるクラス内でオブジェクトがロックされていて、別のクラスが同じオブジェクトをロックしようとすると、デッドロックが発生することを認識しています。

いいえ。1 つのスレッドがオブジェクトをロックし、2 番目のスレッドがそのオブジェクトをロックしようとした場合、2 番目のスレッドは最初のスレッドがロックを終了するまで待機する必要があります。

デッドロックは別のものです:

1. thread1 locks instanceA
2. thread2 locks instanceB
3. thread1 attempts to lock instanceB and now must wait on thread2
4. thread2 attempts to lock instanceA and now must wait on thread1

これら 2 つのスレッドは実行できなくなるため、ロックを解放することはありません。なんて混乱。

lock(UpdateObject) を呼び出すと、3 つの内部オブジェクトのそれぞれと、そこにあるすべての子オブジェクトもロックされますか?

いいえ、「ロック」はロックされたインスタンスのみに適用されます。注: ロックは、2 番目のスレッド以外がそのインスタンスのロックを同時に取得することを妨げません。

于 2012-04-26T01:56:18.680 に答える
3

まず、ロックの要点は、コードの 2 つのセクションが同時に同じロックを取得できないことです。これは、互いに干渉することなく、同じもので動作する複数のスレッドを調整することです。オブジェクトにロックがある場合、ロックを取得しようとする他のユーザーは、元のロックが解放されるまでブロック (待機) します (常に 1 つのスレッドのみがロックを保持できます)。最初のスレッドがロックを放棄しない場合、または両方のスレッドが互いに何かを待っていて、それぞれが待っているものを取得するまでどちらも続行できない場合にのみ、デッドロックが発生します。

第 2 に、lockC# でオブジェクトを作成している場合、オブジェクトをセマンティックな意味で実際に "ロック" しているわけではありません。オブジェクトの「ロック」を取得しています(後で解放または放棄します)。オブジェクトは、取得したいロックを一意に識別するために使用される純粋に便利なトークンです。いいえ、オブジェクトのロックは、そのオブジェクトのサブパーツのロックを作成しません。

于 2012-04-26T01:56:47.993 に答える