.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
}
}
}