Linux學習筆記25 條件變數

2021-09-20 15:36:17 字數 1217 閱讀 5333

條件變數非常類似於js裡的訊號:

執行緒a阻塞著等待條件變數變為真(監聽訊號);

執行緒b發出通知已滿足條件(觸發訊號);

執行緒a解除阻塞開始後面的操作(響應訊號)

與之對應的,我們需要一些型別和介面來監聽、觸發訊號。

條件變數的型別:pthread_cond_t

使用前需要進行初始化:

int pthread_cond_init(pyhread_cond_t *restrict cond, 

const pthread_condattr_t *restrict attr);

int pthread_cond_destroy(pyhread_cond_t *cond);

監聽訊號:

int pthread_cond_wait(pthread_cond_t *restrict cond, 

pthread_mutex_t *restrict mutex);

觸發訊號:

int pthread_cond_signal(pthread_cond_t *cond); //至少喚醒乙個執行緒

int pthread_cond_broadcast(pthread_cond_t *cond);//廣播,喚醒所有執行緒

因為有可能多個執行緒都在監聽同乙個訊號,所以條件變數通常都是跟互斥鎖配合使用,防止發生競爭。

條件變數利用了每個執行緒都可讀寫程序的全域性變數這一特性。所以我們通常把條件變數定義成全域性變數。

#include #include #include #include //程序的全域性變數,每個執行緒都可以讀寫

pthread_mutex_t mutex; //保護條件變數的互斥鎖

pthread_cond_t cond; //條件變數

void *thread1(void *arg);

void *thread2(void *arg);

int main()

執行結果:

➜  code g++ -g -w -o study_linux study_linux.c -lpthread

➜ code ./study_linux

thread1 is running

thread2 is running

可見,pthread_cond_signal一次只喚醒了乙個執行緒。

Linux學習筆記(05 25)條件變數的使用

1.互斥量的存在問題 互斥量是執行緒程式必需的工具,但它們並非萬能的。如果執行緒正在等待共享資料內某個條件出現,它可以重複對互斥物件鎖定和解鎖,每次都會檢查共享資料結構,以查詢某個值。但這種繁忙查詢的效率非常低。可以讓呼叫執行緒短暫地進入睡眠,比如睡眠三秒鐘,但就無法最快作出響應。需要的是 當執行緒...

Linux 執行緒 五 (條件變數)

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

Python學習 2 5條件判斷 迴圈

if 條件判斷1 執行1 elif 條件判斷2 執行2 elif 條件判斷3 執行3 else 執行4 age 21 if age 30 print age elif age 20 print 年齡是 age else print ok birth input birth if birth 2000...