近來在專案中用到條件變數和訊號量做同步時,這一塊一直都有了解,但也一直沒有總結,這次總結一下,給大家提供點參考,也給自己留點紀念。
首先,關於訊號量和條件變數的概念可以自行檢視apue,我這直接把apue中的**拿過來對比;
一,條件變數的使用:
#include structmsg ;
struct msg *workq;
pthread_cond_t qready =pthread_cond_initializer;
pthread_mutex_t qlock =pthread_mutex_initializer;
void
process_msg(
void)}
void
enqueue_msg(
struct msg *mp)
當然,在觸發條件變數時也可以用以下**,兩種方式各有優劣,具體可以參考:
voidenqueue_msg(
struct msg *mp)
二,工作中的使用:
typedef struct_stat
stat;
stat g_enc_stat;
pthread_mutex_t mutex;
pthread_cond_t cond;//可以放在結構體裡面
pthread_cond_init(&cond);
pthread_mutex_init(&mutex);
int dsp_thread_start(unsigned int
trmn)
pthread_mutex_unlock(&mutex);
return
ok;}
/**************************************
* @fn
* @brief
* @param
* @return
* @other
**************************************
*/int dsp_thread_stop(unsigned int
trmn)
void dsp_thread(void
) ...
pthread_mutex_unlock(&mutex);
}}
三,條件變數和訊號量的區別:
(1)使用條件變數可以一次喚醒所有等待者,而這個訊號量沒有的功能,感覺是最大區別。
(2)訊號量是有乙個值(狀態的),而條件變數是沒有的,沒有地方記錄喚醒(傳送訊號)過多少次,也沒有地方記錄喚醒執行緒(wait返回)過多少次。從實現上來說乙個訊號量可以是用mutex + counter + condition variable實現的。因為訊號量有乙個狀態,如果想精準的同步,那麼訊號量可能會有特殊的地方。訊號量可以解決條件變數中存在的喚醒丟失問題。
(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
四,互斥鎖的巧用:
func a
訊號量和條件變數 對比
多個執行緒在讀寫某個共享資料 全域性變數等 時必須通過某種方法實現共享資料的互斥訪問或者同步訪問 例如執行緒 b 等待執行緒 a 的結果以繼續執行 其中,訊號量是一種最常見的方法。訊號量是一種約定機制 在共享資源的互斥訪問中,它約定當乙個執行緒獲得訊號量 wait 後,其他執行緒不可以再次獲得該訊號...
Linux條件變數的使用
linux執行緒同步之間存在多種機制,條件變數是一種類似作業系統裡提到的生產者 消費者演算法的同步機制,允許執行緒以無競爭的方式等待特定條件的發生。示例偽 void thread1 void void thread2 void 條件變數需要配合互斥量一起使用,互斥量作為引數傳入wait函式,函式把呼...
執行緒同步 條件變數和訊號量
上一節提到了執行緒互斥和同步的概念,並且給出了兩種用於解決共享資源互斥的利器 互斥鎖和讀寫鎖。那麼本節將介紹兩種用於解決執行緒同步的概念 條件變數和訊號量。一.條件變數 1.基本概念 互斥鎖的缺點是它只有兩種狀態 鎖定和非鎖定。而條件變數通過允許執行緒阻塞和等待另乙個執行緒傳送訊號的方法彌補了互斥鎖...