-1

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

2个线程:

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

1 回答 1

0

我不会说第 4 点是不可能的,但它非常难,实际上,如果你真的有这个要求,你应该好好想想。

...

既然您意识到您不知道,那么Queue<T>当阅读《生产者/消费者》时,我会立即想到这一点。

假设您有一个线程 runningProducerProc()和另一个 running 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 的东西让消费者线程立即对生产者线程做出反应。这应该已经足够好了。

于 2013-05-16T22:19:53.720 回答