これは、コンセプトの質問の検証です。ここでSOで受け入れられる質問のルールに違反していないことを願っています。回答スレッドにコメントしようとしましたが、そうすることが許可されていません。
この質問に対する受け入れられた回答から導き出します。これは私も持っていた質問です-非ブロッキングロック、
受け入れられた回答のオプション2は次のとおりです。
private int _inUseCount;
public void MyMethod()
{
if (Interlocked.Increment(ref _inUseCount) == 1)
{
// do some stuff
}
Interlocked.Decrement(ref _inUseCount);
}
インクリメントを行うスレッドは、必ずしもコードの「//何かを行う」部分を実行するスレッドであるとは限りません。
次のシナリオを検討してください。
- ThreadA は _inUseCount を 1 にインクリメントし、中断します
- ThreadB は _inUseCount を 2 に増やして中断します
- ThreadA は再開し、_inUseCount が 2 に等しいことを確認し、コードの「何かを実行する」部分を実行せず、_inUseCount を 1 にデクリメントして終了します。
- ThreadB が再開し、_inUseCount が 1 であることを確認し、コードの「何かを行う」部分を実行します。
そして、このパラダイムを使用して、インクリメントを行うスレッドがコードを実行するスレッドであることを確認する方法はありますか?