2013-05-16 31 views

回答

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使消费者线程立即对生产者线程做出反应。这应该真的够好。

相关问题