EventWaitHandle - 多个线程=不一致的行为

时间:2014-04-22 07:43:06

标签: .net multithreading event-wait-handle

我正在尝试使用可以发送命令并接收响应的设备设置一些通信。但我想确保控制超时标志以防止无限期等待。

我做了类似的事情:

private volatile EventWaitHandle _signal;

public void Send()
{
    // Do something

    _signal.WaitOne(30000);

    // Continue with something else

    _signal.Reset();
}

public void Receive() 
{
    _signal.Set();
}

我的问题是,如果我有多个线程(让我们说这个例子为2)可以访问Send方法和以下场景:

主题A:

// Sends a "listen" command, but no response is received 
Send();

主题B:

// Sends a "cancel" command and response (success) is received
Send();

我得到不一致的结果,即有时两个线程都在我得到第二个命令(取消)的响应时继续,我可以理解,但有时第一个线程将达到30000ms超时 - 我无法解释。

关于我遗失和/或做错的任何建议?

1 个答案:

答案 0 :(得分:3)

EventWaitHandle不是此处的相应同步对象。您需要mutual exclusion,以便只有一个线程可以处于发送命令并等待响应的状态。换句话说,线程必须严格轮流与设备通信。

只要您调用Set()然后 all ,一个ManualResetEvent就不会给您这种保证,将取消阻止WaitOne()调用中阻塞的线程。如果这不止一个,那么当两个或多个线程同时尝试发送命令时,程序将会出现故障。

Mutex提供MUTual EXclusion。这就是它的名字。