我有两个线程,一个生产者和一个消费者。
生产者可能并不总是在生产某些东西。然而,消费者需要在它可用时立即消费它。
生产者线程循环工作并将结果放入ConcurrentQueue
. 消费者线程处于循环中,当系统被禁用时while (!disposing)
调用。AutoResetEvent.WaitOne
我也考虑AutoResetEvent.WaitOne
在ConcurrentQueue.TryDequeue
方法返回 false 的情况下调用;只有当队列中没有剩余项目时才会发生这种情况。
但是,如果我这样做,则在完成以下执行时可能会发生死锁:
- 入队
- TryDequeue 返回 true
- TryDequeue 返回 false
- 入队
- 维一
这是此片段中的一种可能性:
while (this.isDisposing == 0)
{
if (this.isEnabled == 0)
{
this.signal.WaitOne();
}
object item;
if (!this.queue.TryDequeue(out item))
{
this.signal.WaitOne();
continue;
}
this.HandleItem(item);
}
不使用锁的正确方法是什么?