簡體   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