ホームページ > バックエンド開発 > C++ > C# の「lock」ステートメントは内部でどのように機能しますか?

C# の「lock」ステートメントは内部でどのように機能しますか?

Mary-Kate Olsen
リリース: 2025-01-15 09:54:44
オリジナル
488 人が閲覧しました

How Does the C# `lock` Statement Work Under the Hood?

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート