[英]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.