雙向訊號和競賽(two-way signaling and races)
monitor.pulse方法的乙個重要特性是它是非同步執行的,這意味著呼叫pulse方法並不會阻塞自己等待monitor.pulse返回。如果任何乙個執行緒在pulsed 物件上等待,它是不會阻塞的,換句話說,呼叫monitor.pulse對程式不會有什麼作用,你可以認為monitor.pulse方法被忽略了。
這樣pulse提供了乙個單向通訊:乙個 pulsing執行緒悄悄的向乙個waiting 執行緒傳送訊號。
pulse並不會返回乙個值來告訴你waiting執行緒是否收到訊號。
但是有時候我們需要知道waiting執行緒是否受到訊號,例如下面的例子:
複製** **如下:
class race}}
static void saysomething()}}
}期待的輸出:
wassup?
wassup?
wassup?
wassup?
wassup?
實際的輸出:
wassup? (執行緒等待)
在saysomething方法中,for迴圈執行到while,此時_go為false,所以monitor.wait開始等待。在mainthread中,for迴圈設定_go為true。然後pulseall.但是pulseall方法是非同步的。
所以在saysomething執行緒被喚醒前,mainthread中的for迴圈可能已經執行完畢。所以saysomething方法中的第乙個wait執行緒收到訊息詞是_go為true,所以往下執行,再次將_go欄位設定為false。輸出」wassup?」,但是下次迴圈由於_go為false,所以需要再次wait.所以實際的輸出列印了乙個wassup,然後開始等待。
我們需要主線程在每一次迭代中如果worker仍然在執行上乙個任務,那麼主線程阻塞。等到worker執行完畢,那麼主線程恢復執行,然後執行迭代。
我們可以增加乙個_ready 標誌,從而控制主線程在設定_go 標誌之前worker執行緒已經ready了。也就是說主線程在設定_go之前,會等待worker完成任務,然後等待worker將ready設為true,當worker將ready設定為true後,通過pulse來通知主線程。
複製** **如下:
class race}}
static void saysomething()}}
}本文標題: 深入多執行緒之:雙向訊號與競賽的用法分析
本文位址:
深入淺出多執行緒系列之十二 雙向訊號和競賽
雙向訊號和競賽 two way signaling and races monitor.pulse方法的乙個重要特性是它是非同步執行的,這意味著呼叫pulse方法並不會阻塞自己等待monitor.pulse返回。如果任何乙個執行緒在pulsed 物件上等待,它是不會阻塞的,換句話說,呼叫monito...
Qt多執行緒之間的訊號傳遞
qt 多執行緒的訊號傳遞 qobject connect const qobject sender,const char signal,const qobject receiver,const char method,qt connectiontype type autoconnection 這個函...
Python多執行緒與多執行緒中join 的用法
文章 python多執行緒與多程序中join 方法的效果是相同的。下面僅以多執行緒為例 首先需要明確幾個概念 知識點一 當乙個程序啟動之後,會預設產生乙個主線程,因為執行緒是程式執行流的最小單元,當設定多執行緒時,主線程會建立多個子執行緒,在python中,預設情況下 其實就是setdaemon f...