基本上我需要的是能够不断地将项目添加到列表(或另一个集合)中,在一个线程中每秒大约 3000 次。并每 2 秒从该列表中获取和删除所有项目。
我不喜欢使用并发集合或每次我需要访问集合时锁定某些东西的经典方法,因为它会比我需要的慢。
我想要做的是有 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();
}
}
有什么方法可以使上述代码按预期工作(线程安全),同时尽可能少地阻塞生产者线程?或者也许是另一种解决方案?