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



我正在尝试用一个设备设置一些命令,在这个设备上你可以发送命令并接收响应。然而,我确实想确保我控制一个超时标志,以防止无限等待时间。

我做了这样的事:

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();

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

关于我遗漏了什么和/或做错了什么,有什么建议吗?

EventWaitHandle不是此处合适的同步对象。您需要互斥,这样只有一个线程可以处于发送命令并等待响应的状态。换句话说,线程必须严格地轮流与设备对话。

ManualResetEvent并不能保证,只要调用Set(),所有在WaitOne()调用上阻塞的线程都将被解除阻塞。如果不止一个,那么当两个或多个线程试图同时发送命令时,程序将出现故障。

Mutex提供了MUTual排除。它就是这样得名的。

相关内容

  • 没有找到相关文章

最新更新