-1
什么是用做以下最佳的数据结构:最佳数据结构? - 2个线程,1名制片人,1名消费者
2个线程:
- 1产生(写入)的数据结构
- 1从数据结构中消耗(读取,然后删除)。
- 线程安全
- 生产者和消费者能够访问数据结构simultaenously
- 高效的大量数据
什么是用做以下最佳的数据结构:最佳数据结构? - 2个线程,1名制片人,1名消费者
2个线程:
我不会说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
,你立即意识到两个线程不会完全同时访问数据结构。但是,他们只能保持最小的时间。而Pulse/Wait使消费者线程立即对生产者线程做出反应。这应该真的够好。