lock
ステートメントの内部の仕組みを詳しく見てみましょう
開発者は、スレッドセーフでないオブジェクトを扱うときに、コードの実行を保護するために lock
ステートメントをよく使用します。しかし、複数のスレッドがこの保護されたコードと対話するとき、内部では正確に何が起こっているのでしょうか?
詳細: lock
ステートメントの実行の追跡
C# 3.0 では、lock
ステートメントは次のコードに変換されます:
<code class="language-C#">var temp = obj; Monitor.Enter(temp); try { // 非线程安全代码 } finally { Monitor.Exit(temp); }</code>
C# 4.0 では、このプロセスが変更され、生成されたコードは次のようになります:
<code class="language-C#">bool lockWasTaken = false; var temp = obj; try { Monitor.Enter(temp, ref lockWasTaken); // 非线程安全代码 } finally { if (lockWasTaken) { Monitor.Exit(temp); } }</code>
Monitor.Enter
関数
Monitor.Enter
は、lock
ステートメントの機能において重要な役割を果たします。 MSDN はその動作を次のように説明しています:
" Enter
を使用して、引数として渡されたオブジェクトの Monitor
を取得します。別のスレッドがそのオブジェクトに対してすでに Enter
を実行しているが、対応する Exit
をまだ実行していない場合、現在のスレッドはブロックされます。別のスレッドがオブジェクトを解放するまで ''
本質的に、Monitor.Enter
はオブジェクトへの排他的アクセスを保証します。別のスレッドが同じロックを取得しようとすると、ロックが解放されるまで中断されます。同じスレッドから Enter
を複数回呼び出してもブロックは発生しませんが、オブジェクトのロックを解除し、待機中のスレッドが実行を再開できるようにするには、同じ回数の Exit
呼び出しが必要です。
待ち時間無限
Monitor.Enter
はロックが使用可能になるまで無期限に待機することに注意してください。一部のロック機構とは異なり、タイムアウトは強制されません。
以上がC# の「lock」ステートメントは内部でどのように機能しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。