最佳数据结构?2个线程,1个生产者,1个消费者
本文关键字:1个 消费者 生产者 线程 数据结构 2个 最佳 | 更新日期: 2023-09-27 18:14:05
做以下事情的最佳数据结构是什么?
2线程:
- 1生成(写入)数据结构
- 1从数据结构中消费(读取然后删除)。
- 线程安全的 生产者和消费者可以同时访问数据结构
- 对大量数据有效
我不会说第4点是不可能的,但它确实很难,实际上,如果你真的有这个要求,你应该好好想想。
…
现在你意识到你不知道,当我阅读《生产者/消费者》时,Queue<T>
会立即出现在我的脑海里。
假设你有一个线程运行ProducerProc()
,另一个运行ConsumerProc()
,一个方法CreateThing()
产生,一个方法HandleThing()
消耗,我的解决方案看起来像这样:
private Queue<T> queue;
private void ProducerProc()
{
while (true) // real abort condition goes here
{
lock (this.queue)
{
this.queue.Enqueue(CreateThing());
Monitor.Pulse(this.queue);
}
Thread.Yield();
}
}
private void ConsumerProc()
{
while (true)
{
T thing;
lock (this.queue)
{
Monitor.Wait(this.queue);
thing = this.queue.Dequeue();
}
HandleThing(thing);
}
}
看到lock
,你立即意识到,两个线程不能完全同时访问数据结构。但是,他们只保留锁很短的时间。脉冲/等待让消费者线程立即对生产者线程做出反应。这应该足够好了。