網路程式設計 條件變數和訊號量 鎖

2021-10-06 13:15:55 字數 1521 閱讀 3498

條件變數和訊號量的區別:

(1)使用條件變數**(broadcast**)可以一次喚醒所有等待者,而這個訊號量沒有的功能,感覺是最大區別。

---------應用場景:當程式退出要喚醒所有執行緒時,執行緒池的執行緒用條件變數;單一執行緒用訊號量;僅有互斥量的執行緒設定某個執行緒退出的標誌;

(2)訊號量是有乙個值(狀態的),而條件變數是沒有的,沒有地方記錄喚醒(傳送訊號)過多少次,也沒有地方記錄喚醒執行緒(wait返回)過多少次。

訊號量由於把訊號值+1,就不管了;

而條件變數是singnal乙個等待的執行緒,如果沒有執行緒等待,就會出現喚醒丟失。所以訊號量可以解決條件變數中存在的喚醒丟失問題。-----------

(3)在posix.1基本原理一文聲稱,有了互斥鎖和條件變數還提供訊號量的原因是:「本標準提供訊號量的而主要目的是提供一種程序間同步的方式;這些程序可能共享也可能不共享記憶體區。互斥鎖和條件變數是作為執行緒間的同步機制說明的;這些執行緒總是共享(某個)記憶體區。這兩者都是已廣泛使用了多年的同步方式。每組原語都特別適合於特定的問題」。儘管訊號量的意圖在於程序間同步,互斥鎖和條件變數的意圖在於執行緒間同步,但是訊號量也可用於執行緒間,互斥鎖和條件變數也可用於程序間。應當根據實際的情況進行決定。訊號量最有用的場景是用以指明可用資源的數量。

經典的一句話:

互斥量是訊號量的一種特例,互斥量的本質是一把鎖。a mutex is basically a lock that we set (lock) before accessing a shared resource and release (unlock) when we』re done

鎖和條件變數、訊號量

條件變數和鎖

條件變數和鎖

pthread_cond_wait指的是條件變數,總和乙個互斥鎖結合使用。在呼叫pthread_cond_wait前要先獲取鎖。pthread_cond_wait函式執行時先自動釋放指定的鎖,然後等待條件變數的變化。在函式呼叫返回之前,自動將指定的互斥量重新鎖住。

int pthread_cond_signal(pthread_cond_t * cond);

pthread_cond_signal通過條件變數cond傳送訊息,若多個訊息在等待,它只喚醒乙個。

pthread_cond_broadcast可以喚醒所有。呼叫pthread_cond_signal後要立刻釋放互斥鎖,因為pthread_cond_wait的最後一步是要將指定的互斥量重新鎖住,如果pthread_cond_signal之後沒有釋放互斥鎖,pthread_cond_wait仍然要阻塞。

無論哪種等待方式,都必須和乙個互斥鎖配合,以防止多個執行緒同時請求pthread_cond_wait()(或pthread_cond_timedwait(),下同)的競爭條件(race

condition)。mutex互斥鎖必須是普通鎖(pthread_mutex_timed_np)或者適應鎖

(pthread_mutex_adaptive_np)

訊號量,鎖,條件變數的區別

互斥鎖 plain view plain copy pthread mutex t mutex pthread mutex initializer 或 pthread mutex t mutex int pthread mutex init pthread mutex t mutex,const p...

訊號量和條件變數 對比

多個執行緒在讀寫某個共享資料 全域性變數等 時必須通過某種方法實現共享資料的互斥訪問或者同步訪問 例如執行緒 b 等待執行緒 a 的結果以繼續執行 其中,訊號量是一種最常見的方法。訊號量是一種約定機制 在共享資源的互斥訪問中,它約定當乙個執行緒獲得訊號量 wait 後,其他執行緒不可以再次獲得該訊號...

Linux C程式設計中條件變數與互斥鎖 訊號量的區別

1.互斥鎖必須總是由給它上鎖的執行緒解鎖,訊號量的掛出即不必由執行過它的等待操作的同一程序執行。乙個執行緒可以等待某個給定訊號燈,而另乙個執行緒可以掛出該訊號燈。2.互斥鎖要麼鎖住,要麼被解開 二值狀態,型別二值訊號量 3.由於訊號量有乙個與之關聯的狀態 它的計數值 訊號量掛出操作總是被記住。然而當...