あなたがすべてのオブジェクトに関連付けられたクリティカルセクションはどのように初期化されますか?
lock (obj)
...
.NETは、次のステートメントを同期させるためにobj
でクリティカルセクションを使用しますと言います。
このクリティカルセクションはどのように初期化されますか? (例えば、構築時に初期化されているのか、遅延していますか?)
あなたがすべてのオブジェクトに関連付けられたクリティカルセクションはどのように初期化されますか?
lock (obj)
...
.NETは、次のステートメントを同期させるためにobj
でクリティカルセクションを使用しますと言います。
このクリティカルセクションはどのように初期化されますか? (例えば、構築時に初期化されているのか、遅延していますか?)
すべてのオブジェクトは、SyncTableEntryへのインデックスである、それに割り当てられたメモリの4バイトの「ブロック」(syncblk)を取得します。オブジェクトが作成されると、syncblkに0が割り当てられ、余分なメモリ割り当て(この4バイト数以外)が防止されます。ロックがとられると、このsyncblkはテーブル内の適切なエントリに設定され、割り当てが行われる可能性があります。実際には、それは怠惰な初期化です。
lock(オブジェクト)を呼び出すと、オブジェクト上でMonitor.Enter
が効果的に使用され、そのエントリが適切に設定されます。詳細はMSDN article on .NET Memory Internalsを参照してください。
ああ、賢い!ありがとう! – Mehrdad
Microsoftの文書によると、このプロセスは、CRITICAL_SECTION型の変数が宣言されたときにクリティカルセクションのメモリを割り当てます。
オブジェクトにクリティカルセクションがあると思いますか? –
[Lock(Monitor)internal implementation in .NETの可能な複製](http://stackoverflow.com/questions/5111779/lock-monitor-internal-implementation-in-net) –
@JimMischelそれと似ていますが、その問題よりも焦点がある。 –