1

SyncLock を正しく理解していることを確認したいだけです。次のコードを考えると、これらのブロックが同時に実行されることはないと言っても過言ではありませんか? それとも、これらのブロックの実行中に他のコードは実行されないと言っても過言ではありませんか? SyncLock が正確に何をするのか、ロックするためにランダムなオブジェクトが必要な理由を理解するのに苦労していますか?

Dim PADLOCK As Object = New Object()

ブロック A:

SyncLock PADLOCK
   '...Code
End SyncLock

ブロック B:

SyncLock PADLOCK
   '...Code
End SyncLock

ブロック C:

SyncLock PADLOCK
   '...Code
End SyncLock
4

2 に答える 2

4

完全ではありません。

まず、ロックは再入可能であるため、あるメソッドが別のメソッド (または同じメソッドを再帰的に呼び出す) を呼び出すと、両方が同じスレッドによって使用される可能性があります。

次に、「...コード」にロックを放棄Monitor.Waitする- が含まれている場合。この場合、メソッドに 2 つのスレッドを含めることができますが、アクティブなスレッドは 1 つだけです。呼び出しは、待機中のスレッドがロックを再度取得できるようになるまでブロックされます。そのため、多くても 1 つのスレッドがロックを「保持」しているままです。Wait

于 2012-09-27T19:01:04.127 に答える
0

あまり。同じブロック内のコードは、異なるスレッドによって同時に実行されることはありません。プロセスが SyncLock の最後に到達すると、CLR はロックを解放します。

なぜ「ランダム」オブジェクトが必要なのか(あなたが言ったように)、CLRオブジェクトがどのように構築され、メモリに配置され、管理されるかについて、より多くの説明ともう少し深い理解が必要です。

近いうちに、常にロック ステートメントで Reference 型を使用する必要があり、このオブジェクトはデッドロックを防ぐために非パブリックである必要があります。繰り返しになりますが、短い回答ですべてを説明するのは本当に難しいので、Jeffrey Richter の本「.Net 経由の CLR」をお勧めします。

于 2012-09-27T19:02:06.840 に答える