2011-12-22 11 views
4

あなたがすべてのオブジェクトに関連付けられたクリティカルセクションはどのように初期化されますか?

lock (obj) 
    ... 

.NETは、次のステートメントを同期させるためにobjでクリティカルセクションを使用しますと言います。

このクリティカルセクションはどのように初期化されますか? (例えば、構築時に初期化されているのか、遅延していますか?)

+2

オブジェクトにクリティカルセクションがあると思いますか? –

+0

[Lock(Monitor)internal implementation in .NETの可能な複製](http://stackoverflow.com/questions/5111779/lock-monitor-internal-implementation-in-net) –

+0

@JimMischelそれと似ていますが、その問題よりも焦点がある。 –

答えて

4

すべてのオブジェクトは、SyncTableEntryへのインデックスである、それに割り当てられたメモリの4バイトの「ブロック」(syncblk)を取得します。オブジェクトが作成されると、syncblkに0が割り当てられ、余分なメモリ割り当て(この4バイト数以外)が防止されます。ロックがとられると、このsyncblkはテーブル内の適切なエントリに設定され、割り当てが行われる可能性があります。実際には、それは怠惰な初期化です。

lock(オブジェクト)を呼び出すと、オブジェクト上でMonitor.Enterが効果的に使用され、そのエントリが適切に設定されます。詳細はMSDN article on .NET Memory Internalsを参照してください。

+0

ああ、賢い!ありがとう! – Mehrdad

0

Microsoftの文書によると、このプロセスは、CRITICAL_SECTION型の変数が宣言されたときにクリティカルセクションのメモリを割り当てます。

関連する問題