を使用ReaderWriterLockSlim
して読み取り/書き込みロックを取得する場合、変数を作成する必要がありvolatile
ますかInterlocked.Increment
?
たとえば、Add
以下のメソッドのコードは正常に機能しますか?それとも拡張が必要ですか?
public class AppendableList<T> { // semi-immutable; supports appending only
private T[] data = new T[16];
private ReaderWriterLockSlim rwLock = new ReaderWriterLockSlim();
public int Count { get; private set; }
public T this[int index] {
get {
rwLock.EnterReadLock();
try { return data[index]; } finally { rwLock.ExitReadLock(); }
}
}
public void Add(T item) {
rwLock.EnterUpgradeableReadLock();
try {
if (Count == data.Length)
reAllocateArray(); // upgrades to write lock
data[Count++] = item; // do I need to use Interlocked here?
} finally { rwLock.ExitUpgradeableReadLock(); }
}
}
編集:複数のスレッドがデータに同時にアクセスできるようにする軽量で高速でシンプルなリストを作成しようとしています(一種のプロデューサー/コンシューマーバッファー)。上記のコードを編集して、以前に使用した簡略化を削除したので、問題がより明確になるはずです。このコードはスレッドセーフであるように思えますがCount
、アップグレード可能なロックを終了した直後にすべてのスレッドが の更新された値を見るかどうかはわかりません。
編集 2 : ここでの「書き込み」ロックは、配列要素ではなく、配列参照への書き込みを示すために使用されます。これで十分だと思います (データ自体は不変であるため)。インクリメントするときは Interlocked を使用する必要があると思いますCount
。本当?