■102253 / ) |
Re[1]: ロックがかかっている場合待たずに処理をスキップ |
□投稿者/ 魔界の仮面弁士 (3676回)-(2023/08/04(Fri) 10:37:32)
|
2023/08/04(Fri) 10:50:17 編集(投稿者)
■No102252 (kiku さん) に返信 > ロックがかかっている場合に、 > 待たずに処理をスキップしたいのですが、
lock ステートメントでは無く、ロック取得時にタイムアウト時間を 指定できるメソッドを試してみてください。
たとえば「ReaderWriterLockSlim クラス」を使ってみるのは如何でしょう。
このクラスは、 未入力 読取状態 更新状態 書込状態 の 4 状態を持っており、読み書きでロックが分かれていることで デッドロックしにくい設計になっています。 (その分、単純 lock よりも若干遅くなります)
使う時は、TryEnter何某Lock でロックを取得、Exit何某Lock でロック解除です。 TryEnter{Read|Write|UpgradeableRead}Lock メソッドの引数には タイムアウトを時間を指定できます。
「ReaderWriterLockSlim クラス」以外にも、 「ReaderWriterLock クラス」というものがあります。
こちらは、書き込みは単一、読取りは複数の場合に使われるもので、 ロック取得時のタイムアウト時間を指定できるようになっています。
そのほか、「Monitor クラス」を使ってみることもできます。 このクラスの TryEnter メソッドでタイムアウト時間を指定できます。
ちなみにこの Monitor クラスは、C# の lock ステートメントの 内部処理でも使われています。lock ステートメントでは、 タイムアウト指定のない Enter メソッドが呼ばれるだけですけれどね。 https://ufcpp.net/study/csharp/sp_thread.html#dotnet4
|
|