Lock クラス
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
注意
このプレビュー API を使用するには、プロジェクト ファイル内の EnablePreviewFeatures
プロパティを True
に設定することで、プロジェクトでプレビュー機能を有効にする必要があります。 詳細については、「https://aka.ms/dotnet-preview-features」を参照してください。
異なるスレッド間のコード領域で相互除外を実現するためのメカニズムを提供します。
public ref class Lock sealed
[System.Runtime.Versioning.RequiresPreviewFeatures]
public sealed class Lock
[<System.Runtime.Versioning.RequiresPreviewFeatures>]
type Lock = class
Public NotInheritable Class Lock
- 継承
-
Lock
- 属性
注釈
クラスを Lock 使用すると、リソースへの同時アクセスを防ぐために、プロセスのスレッド間で相互に排他的なアクセスを必要とするコードの領域 (一般にクリティカル セクションと呼ばれます) を定義できます。 を Lock
入力および終了できます。ここで、開始と終了の間のコード領域は、ロックに関連付けられている重要なセクションです。 ロックに入ったスレッドは、ロックを終了するまでロックを保持または所有していると言われます。 最大 1 つのスレッドは、任意の時点でロックを保持できます。 スレッドは複数のロックを保持できます。 スレッドは、再帰的になど、終了する前に複数回ロックを入力できます。 ロックをすぐに入力できないスレッドは、ロックを入力できるまで、または指定したタイムアウトが切れるまで待機できます。
メソッドまたは TryEnter メソッドをEnter使用してロックを入力する場合:
- ブロックを使用して C# などの例外が発生した場合でも、スレッドが でロック Exit を
try/finally
終了していることを確認します。 - ロックが C#
async
メソッドで入力および終了されている場合は、入り口と終了の間にがないことをawait
確認します。 ロックはスレッドによって保持され、 に続くawait
コードは別のスレッドで実行される可能性があります。
C# キーワード (keyword)などの返された Lock.Scope を自動的に破棄する言語コンストラクトで メソッドを使用EnterScopeするか、C# using
lock
キーワード (keyword)を使用することをお勧めします。例外の場合はロックが終了します。 これらのパターンには、 と Exit
を使用Enter/TryEnter
するよりもパフォーマンス上の利点がある場合もあります。 次のコード フラグメントは、ロックを開始および終了するためのさまざまなパターンを示しています。
public sealed class ExampleDataStructure
{
private readonly Lock _lockObj = new();
public void Modify()
{
lock (_lockObj)
{
// Critical section associated with _lockObj
}
using (_lockObj.EnterScope())
{
// Critical section associated with _lockObj
}
_lockObj.Enter();
try
{
// Critical section associated with _lockObj
}
finally { _lockObj.Exit(); }
if (_lockObj.TryEnter())
{
try
{
// Critical section associated with _lockObj
}
finally { _lockObj.Exit(); }
}
}
}
C# lock
キーワード (keyword)を使用する場合や、ロックを開始および終了する場合、式の型は正確に System.Threading.Lock
である必要があります。 式の型が や のようなT
ジェネリック型などのObject
他の型である場合は、代わりに互換性のない別の実装 (などMonitor) を使用できます。 詳細については、関連する コンパイラ スペックレットを参照してください。
Interrupt は、ロックの入力を待機しているスレッドを中断できます。 Windows STA スレッドでは、ロックを待機すると、待機中に同じスレッドで他のコードを実行できるメッセージ ポンプが許可されます。 待機の一部の機能は、カスタム SynchronizationContextによってオーバーライドできます。
注意
ロックに入るスレッド (再帰的になど) は、ロックを完全に終了し、他のスレッドがロックに入ることができるように、同じ回数だけロックを終了する必要があります。 を保持 Lock
している間にスレッドが終了すると、 の Lock
動作は未定義になります。
注意事項
コード パスで、スレッドが終了する前に複数のロックを入力する可能性がある場合は、同じスレッドで 2 つのロックに入る可能性があるすべてのコード パスが同じ順序で入力されるようにします。 そうしないと、デッドロックが発生する可能性があります。 たとえば、あるコード パス スレッドT1
では、両方を終了する前にロックL2
L1
を入力し、別のコード パス スレッドT2
では両方のロックを逆の順序で入力するとします。 そのシナリオでは、次の順序のイベントが発生する可能性があります。enters L1
、 T2
entersL2
、enters、 T1
enter L2
および waits、 T2
enter L1
および waits T1
を試みます。 と の間T1
T2
には解決できないデッドロックがあり、将来いずれかのロックを入力しようとする他のスレッドもハングします。
コンストラクター
Lock() |
Lock クラスの新しいインスタンスを初期化します。 |
プロパティ
IsHeldByCurrentThread |
ロックが現在のスレッドによって保持されているかどうかを示す値を取得します。 |
メソッド
Enter() |
ロックを入力し、必要に応じてロックを入力するまで待機します。 |
EnterScope() |
ロックを入力し、必要に応じてロックを入力するまで待機します。 |
Equals(Object) |
指定されたオブジェクトが現在のオブジェクトと等しいかどうかを判断します。 (継承元 Object) |
Exit() |
ロックを終了します。 |
GetHashCode() |
既定のハッシュ関数として機能します。 (継承元 Object) |
GetType() |
現在のインスタンスの Type を取得します。 (継承元 Object) |
MemberwiseClone() |
現在の Object の簡易コピーを作成します。 (継承元 Object) |
ToString() |
現在のオブジェクトを表す文字列を返します。 (継承元 Object) |
TryEnter() |
待機せずにロックの入力を試みます。 |
TryEnter(Int32) |
ロックの入力を試み、必要に応じて、ロックを入力できるようになるまで、指定したミリ秒数待機します。 |
TryEnter(TimeSpan) |
ロックの入力を試み、ロックを入力できるまで、または指定したタイムアウトが切れるまで、必要に応じて待機します。 |
適用対象
.NET