用于执行以下操作的最佳数据结构是什么:
2个主题:
答案 0 :(得分:0)
我不会说第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事件使得消费者线程立即对生产者线程作出反应。这应该足够好了。