私はReaderWriterLockSlimを使用して読み取り/書き込みを同期してきましたが、これまでのところ非常にうまく機能しています。
オブジェクトのコレクションがあり、読み取り/書き込みロックはDictionary<string, ReaderWriterLockSlim>
. 複数の読み取りロックをアトミックに取得する必要があるシナリオがあります。1 つのスレッドが同時に複数の書き込みロックを保持しようとするようなコードを持っていないことは確かです。そのため、以下のコードは問題なく動作すると思います。
読み取りロックではなく書き込みロックを使用して以下のアプローチを試みた場合、ロックが常に同じ順序で発生することを保証できない限り、デッドロックが発生することはほぼ確実です (私の場合はできません)。
次のことを前提として、このコードに問題がある人はいますか?
- 他の場所では、書き込みロックを保持しているスレッドは、他のロック (読み取りまたは書き込み) を保持できません。
- 複数のスレッドが任意の数の読み取りロックを同時に保持できます
何かご意見は?
public void WithReaderLocksForItemsNamed(string[] itemNames, Action action)
{
// this gets locks for the items specified from my internation dictionary
ReaderWriterLockSlim[ ] locks = LocksForItemsNamed( itemNames ) ;
try
{
foreach( var @lock in locks )
{
@lock.EnterReadLock( ) ;
}
action( ) ;
}
finally
{
foreach( var @lock in locks )
{
if (@lock.IsReadLockHeld)
{
@lock.ExitReadLock( ) ;
}
}
}
}