繁体   English   中英

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

[英]EventWaitHandle - multiple threads = inconsistent behaviour

我正在尝试与设备建立一些通信,您可以在其中发送命令并接收响应。 但是,我确实想确保控制超时标志以防止不确定的等待时间。

我做了这样的事情:

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超时-我无法解释。

关于我缺少和/或做错什么的任何建议吗?

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

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

互斥锁提供互斥。 这就是它的名字。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM