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

本文关键字:1个 消费者 生产者 线程 数据结构 2个 最佳 | 更新日期: 2023-09-27 18:14:05

做以下事情的最佳数据结构是什么?

2线程:

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

最佳数据结构?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,你立即意识到,两个线程不能完全同时访问数据结构。但是,他们只保留锁很短的时间。脉冲/等待让消费者线程立即对生产者线程做出反应。这应该足够好了。