Linux筆記 27 執行緒同步 條件變數

2021-09-24 20:45:18 字數 1155 閱讀 6631

讀寫鎖,互斥鎖並不是任何時候都能阻塞執行緒執行

1. 假設有執行緒操作如下:

a. 煉表頭節點node *head = null

b. wile(head == null)

//鍊錶中不為空時執行**段

...

條件變數

1. 條件變數並不是鎖,本質是一組函式,用來阻塞執行緒

2. 條件變數 + 互斥鎖 = 執行緒同步

a. 互斥鎖:保護一塊共享資料

b. 條件變數:引起阻塞

3. 動作:

a. 阻塞執行緒

b. 喚醒乙個阻塞的執行緒

4. 條件變數型別:

pthread_cond_t cond

5. 初始化條件變數:

pthread_cond_init(pthread_cond_t *restrict cond, const pthread_condattr_t *restrict attr);

6. 銷毀條件變數:

pthread_cond_destroy(pthread_cond_t *cond);

7. 阻塞等待

pthread_cond_wait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex);

作用:a. 阻塞執行緒

b. 將已經上鎖的mutex解鎖,這樣可以讓其他執行緒操作保護的共享資源

c. 當執行緒解除阻塞時,會對mutex進行加鎖狀態,保持之前的狀態一致

8. 限時等待乙個條件變數:

pthread_cond_timedwait(pthread_cond_t *restrict cond,

pthread_mutex_t *restrict mutex,

const struct timespec *restrict abstime);

9. 喚醒阻塞執行緒:

a. 至少喚醒乙個:

pthread_cond_signal(pthread_cond_t *cond); //如果阻塞了10個,則至少喚醒1個

b. 喚醒全部:

pthread_cond_broadcast(pthread_cond_t *cond); //如果阻塞了10個,則喚醒10個

Linux執行緒同步 條件變數

執行緒間的同步還有乙個情況 程序a 需要等待乙個條件成立,才執行,當條件不成立時就阻塞等待 程序b 需要設定條件,當條件成立時,喚醒程序a.這裡我們就可以用到條件變數。條件變數變數也是出自posix執行緒標準,另一種執行緒同步機制,主要用來等待某個條件的發生,然後進行相應的操作,這樣可以消除多執行緒...

Linux 執行緒同步 條件變數

pthread cond signal 使在條件變數上等待的執行緒中的乙個執行緒重新開始。如果沒有等待的執行緒,則什麼也不做。如果有多個執行緒在等待該條件,只有乙個能重啟動,但不能指定哪乙個。pthread cond broadcast 重啟動等待該條件變數的所有執行緒。如果沒有等待的執行緒,則什麼...

Linux執行緒同步之條件變數

與互斥鎖不同,條件變數是用來等待而不是用來上鎖的。條件變數用來自動阻塞乙個執行緒,直到某特殊情況發生為止。通常條件變數和互斥鎖同時使用。條件變數使我們可以睡眠等待某種條件出現。條件變數是利用執行緒間共享的全域性變數進行同步的一種機制,主要包括兩個動作 乙個執行緒等待 條件變數的條件成立 而掛起 另乙...