最佳数据结构? - 2个线程,1个生产者,1个消费者

时间:2013-05-16 21:31:22

标签: c# performance thread-safety consumer producer

用于执行以下操作的最佳数据结构是什么:

2个主题:

  1. 1生成(写入)数据结构
  2. 1从数据结构中消耗(读取然后删除)。
  3. 线程安全
  4. 生产者和消费者可以同时访问数据结构
  5. 高效处理大量数据

1 个答案:

答案 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事件使得消费者线程立即对生产者线程作出反应。这应该足够好了。