基本的に私が必要とするのは、1 つのスレッドで 1 秒あたり約 3000 回、リスト (または別のコレクション) にアイテムを常に追加できるようにすることです。そして、2 秒に 1 回、そのリストからすべての項目を取得して削除します。
並行コレクションを使用したり、コレクションにアクセスする必要があるたびに何かをロックしたりするなど、これを行う従来の方法は好きではありません。必要以上に遅くなるためです。
私がやろうとしているのは、スレッドごとに 1 つずつ、2 つのコレクションを持ち、あるコレクションから別のコレクションにスレッドセーフに切り替える方法を見つけることです。
簡略化された、スレッドセーフではない例:
var listA = new List<int>();
var listB = new List<int>();
// method is called externally 3000 times per second
void ProducerThread(int a)
{
listA.Add(a)
}
void ConsumerThread()
{
while(true)
{
Thread.Sleep(2000);
listB = Interlocked.Exchange(ref listA,listB);
//... processing listB data
// at this point when i'm done reading data
// producer stil may add an item because ListA.Add is not atomic
// correct me if i'm wrong
listB.Clear();
}
}
プロデューサースレッドのブロックをできるだけ少なくしながら、上記のコードを意図したとおりに (スレッドセーフにするために) 動作させる方法はありますか? それとも別の解決策ですか?