深入多執行緒之 雙向訊號與競賽的用法分析

2022-09-26 09:27:10 字數 1215 閱讀 3261

雙向訊號和競賽(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...