スレッドセーフ リストを実装したいのですが、単一の操作 (追加、削除など) だけでなく、操作のブロック全体でスレッド セーフを確保する必要があります。ユース ケースは次のようになります。
list.Lock();
list.Add(sth);
list.RemoveAt(4);
list.Unlock();
リストですべての操作にロックが必要になるようにします。例えば:
list.Add(sth);
事前にロックせずに呼び出すと、例外が発生するはずです。lock()
これが、このステートメントを使用しない理由です。このソリューションでは、ロック チェックが重要です。
Monitor を使用してそのようなリストを実装するのは難しくありませんが、リストがロックされているかどうかを確認するまでは必要です。次のシナリオを考えました。
// Inside list class
private object lockObject;
private bool locked;
public void Lock()
{
Monitor.Enter(lockObject);
locked = true;
}
public void Unlock()
{
Monitor.Exit(lockObject);
locked = false;
}
locked
残念ながら、このコードは、クリティカル セクションに入る前またはクリティカル セクションから出る前または後に設定されているかに関係なく、競合状態になりがちです。
TryEnter を使用する別の方法もありますが、この方法では、ロックが取得されない場合に実際にクリティカル セクションに入り、競合状態が発生する可能性があります。
リストがロックされているかどうかにかかわらず、このメカニズムをスレッドセーフにする方法と、チェック中に競合状態を回避する方法を実装する必要がありますか?