3

を格納するスレッド化されたサーバー アプリケーションがありますList<Item> dataList。リストの項目を変更、追加、および削除する単一の書き込みスレッドと、このリストから読み取る複数のスレッドがあります。

書き込みが呼び出された順序で確実に行われ、読み取りのパフォーマンスが最大になるようにするために必要な同期の種類。

私は現在ReaderWriterLockSlim、個別の読み取りロック機能と書き込みロック機能を使用していますが、必要なのは書き込みが順番に保証されることだけなので、不要な ReadLocks を呼び出す高価なオーバーヘッドがたくさんあるように感じますか?

私が理解している限り、参照型と値型の読み取りはアトミックアクセスを提供する必要があるため、ロックはおそらく必要ありませんか?

パフォーマンスは大きな懸念事項であり、同期構造を最適化することでかなり改善できるようです。

4

3 に答える 3

2

生産者/消費者のパターンがあるようです。.Net 4 では、名前空間にConcurrentQueue<T> クラスがあります。System.Threading.Concurrentキューに追加およびキューから削除するときにのみ同期しています。

于 2012-06-24T09:56:48.337 に答える
0

同期がないと、読み取りは書き込み操作の前後から部分的な情報を取得する可能性があります(たとえば、古いリストから30%、新しいリストから70%)。これが問題にならない場合は、ライターが1つしかない限り、同期を使用する必要はありません。

リストにオブジェクトが含まれている場合は、新しいデータを新しいオブジェクトに書き込んでから、この新しい要素をリスト内の要素と交換することをお勧めします。私が知らない内部メカニズムがない限り、参照の変更はアトミックである必要があります。

Object temp = new Object();
temp.value = 5;
temp.name = "whatever";
list[5] = temp;

それ以外の:

list[5].value = 5;
list[5].name = "whatever";
于 2012-06-24T01:43:27.173 に答える
-1

ReaderWriterLockSlim 何らかの重大な理由でロックに入ることができない可能性がない限り、ここでは実際には必要ありません。
SimpleLock(syncObj)で十分です。読み取り/書き込み操作の前にロックを配置するだけです。

必要な場合TryEnterは、コードを確認する必要があります。

于 2012-06-24T10:15:09.523 に答える