Python執行緒專題7 條件變數

2021-09-13 09:43:23 字數 1270 閱讀 2770

python執行緒專題6:事件

python執行緒專題8:使用鎖的注意事項

條件變數時構建在另乙個鎖上的同步原語,當需要執行緒關注特定的狀態變化或事件發生時將使用這個鎖。典型的用法是生產者與消費者問題,其中乙個執行緒生產的資料提供給另外乙個執行緒使用。

c=condition(lock)

穿件新的條件變數。lock時可選的lock或rlock的例項。如果未提供lock引數,就會建立新的rlock例項供條件變數使用。

c.acquire(*args):獲取底層鎖。此方法將呼叫底層鎖上對應的acquire(*args)方法。

c.release():釋放底層鎖。此方法將呼叫底層鎖上對應的release()方法

c.wait(timeout):等待直到獲取通知或出現超時為止。此方法在呼叫執行緒已經獲取鎖之後呼叫。

呼叫時,將釋放底層鎖,而且執行緒將進入睡眠狀態,直到另乙個執行緒在條件變數上執行notify()或notify_all()方法將其喚醒為止。

如果超時,執行緒將被喚醒,重新獲取鎖,而控制將被返回。

c.notify(n):喚醒乙個或多個等待此條件變數的執行緒。此方法只會在呼叫執行緒已經獲取鎖之後呼叫,

而且如果沒有正在等待的執行緒,它就什麼也不做。

n指定要喚醒的執行緒數量,預設為1.被喚醒的執行緒在它們重新獲取鎖之前不會從wait()呼叫返回。

c.notify_all():喚醒所有等待此條件的執行緒。

#條件變數例項

from threading import condition

c=condition()

def producer():

while true:

c.acquire()

#生產東西

...c.notify()

c.release()

def consumer():

while true:

c.acquire()

while 沒有可用的東西:

c.wait()#等待出現

c.release()

#使用生產的東西

...

注意:如果存在多個執行緒等待同乙個條件,notify()操作會喚醒他們中的乙個或多個(這種行為取決於底層的作業系統)。因此,始終有這樣的可能:某個執行緒被喚醒後,缺發現它等待的條件不存在了,這解釋了為什麼在consumer函式中使用while迴圈,如果執行緒醒來,但是生成的項已經消失,它就會回去等待下乙個訊號。

7 條件變數簡介

條件變數,先談談自己的理解吧!互斥量解決了不同執行緒處理共享資源的問題,比如有倆執行緒one和two以及和乙個共享資源share,one和two每次處理share的前提都是成功獲取互斥量mutex,這樣的做法保證了共享資源在一段時間裡只被乙個執行緒處理,也即保證了處理共享資源的原子性。但這還不夠,常...

執行緒同步(2)條件變數

互斥鎖有乙個明顯的缺點就是只有兩種狀態 鎖定和非鎖定,而條件變數通過允許執行緒阻塞和等待另個執行緒傳送訊號的方法來彌補互斥鎖的不足。條件變數通常和互斥鎖一起使用。條件變數的結構為pthread cond t 涉及函式 pthread cond init pthread cond detroy pth...

Linux 執行緒 五 (條件變數)

我們先看一下條件變數的api 條件變數 1.定義條件變數 pthread cond t cond 2.初始化 pthread cond init cond,null 3.等待條件 pthread cond wait cond,mutex 1 mutex 如果沒有在互斥環境,形同虛設 2 如果在,wa...