线程竞争条件并使用计时器唤醒线程

时间:2016-12-21 21:36:31

标签: c# multithreading race-condition

我有一个带有使用者和提供者线程以及队列的C#控制台应用程序。消费者处于永久循环中,被手动重新阻止。提供程序线程将一个对象放入队列,并通知manualrestevent以解除阻塞。使用者从队列接收对象,处理它并检查队列中是否有其他对象。如果队列为空,则使用者重置manualresetevent。

我发现的问题是,在消费者检查队列和重置manualresetevent之间,提供者可能会在重置manualresetevent之前加载队列并发送一个设置信号,从而挂起应用程序。

我考虑过每隔几秒使用一个计时器来唤醒线程来检查队列,这是解决这个问题的合理方法吗?

1 个答案:

答案 0 :(得分:0)

在检查队列之前重置ManualResetEvent ,然后不要回到等待事件的位置,直到队列耗尽为止。这样,比赛可以做的更糟糕的事情就是对空队列进行单一的虚假检查。

或者,由于您现在要立即重置,请改用AutoResetEvent

或者,如果可以,请使用BlockingCollection并让它为您处理同步。