執行緒同步機制條件變數的使用與思考

2021-08-13 15:55:52 字數 2587 閱讀 2105

條件變數是linux執行緒同步的一種機制,與互斥量一起使用時,允許執行緒以無競爭的方式等待特定條件的發生

示例一些思考

reference

about me

#include 

// 靜態初始化

pthread_cond_t cond = pthread_cond_initializer;

// 動態初始化

int pthread_cond_init(thread_cond_t *cond,

const pthread_condattr_t *attr);

// 反初始化,即登出

int pthread_cond_destroy(pthread_cond_t *cond);

返回值: 若成功,返回0;否則,返回錯誤編碼

注意:

+ 只有在沒有執行緒在該條件變數上等待時,才可以登出條件變數,否則會返回ebusy

+linux在實現條件變數時,並沒有為條件變數分配資源,所以在登出乙個條件變數時,只需要注意該變數是否仍有等待執行緒即可

#include 

int pthread_cond_wait(pthread_cond_t *cond,

pthread_mutex_t *mutex);

int pthread_cond_timedwait(pthread_cond_t *cond,

pthread_mutex_t *mutex,

const struct timespec *abstime);

返回值: 若成功,返回0;否則,返回錯誤編碼

執行過程如下:

1. 呼叫者把鎖住的互斥量傳給函式,然後函式自動把呼叫執行緒放到等待條件的執行緒列表上

2. 對互斥量進行解鎖,執行緒掛起進入等待(不占用cpu時間) 

3. 函式被喚醒返回時,會自動對互斥量進行加鎖

pthread_cond_timedwait只是多了乙個等待超時時間,通過timespec指定,超時返回錯誤etimedout

#include 

int pthread_cond_signal(pthread_cond_t *cond);

int pthread_cond_broadcast(pthread_cond_t *cond);

返回值: 若成功,返回0;否則,返回錯誤編碼

示例**可參考我的[github](由於篇幅原因,不在此貼出條件變數實質是利用執行緒間共享的全域性變數進行同步的一種機制示例中的相關**
pthread_mutex_lock(&(test->mut));

while (test->condition ==

0)pthread_mutex_unlock(&(test->mut));

互斥量是用來保護條件`test->condition`在讀取時,它的值不被其它執行緒修改,如果條件成立,則此執行緒進入等待條件的執行緒佇列,對互斥量進行解鎖並開始等待如上面的**所示,使用`while`對條件進行判斷的原因如下: 1. 若先解鎖互斥量,再喚醒等待執行緒,則條件可能被其它執行緒更改,使得等待條件再次成立,需要繼續等待 2. `pthread_cond_wait`可能存在意外返回的情況,則此時條件並沒有被更改,需要繼續等待。
造成意外返回的原因是linux中帶阻塞功能的系統呼叫都會在程序收到signal後返回

示例**: 1. 情況一:先喚醒
pthread_mutex_lock(&(test->mut));

test->condition = 1

pthread_cond_signal(&(test->cond));

pthread_mutex_unlock(&(test->mut));

情況二:先解鎖

pthread_mutex_lock(&(test->mut));

test->condition = 1

pthread_mutex_unlock(&(test->mut));

pthread_cond_signal(&(test->cond));

兩種情況各有缺點: + 情況一在喚醒等待執行緒後,再解鎖,使得等待執行緒在被喚醒後試圖對互斥量進行加鎖時,互斥量還未解鎖,則執行緒又進入睡眠,待互斥量解鎖成功後,再次被喚醒並對互斥量加鎖,這樣就會發生兩次上下文切換,影響效能 + 情況二在喚醒等待執行緒前先解鎖,使得其它執行緒可能先於等待執行緒獲取互斥量,並對條件進行更改,使得條件變數失去作用- github:answerywj

- blog:

- email:[email protected]

- weibo:@answer不是答案

- csdn:answer不是答案的專欄

本作品採用知識共享署名-相同方式共享 4.0 國際許可協議進行許可。

(4 2)Linux執行緒同步機制 條件變數

1 任務同步 相互合作關係 直接相互制約的關係 1 程式設計中存在這樣的情況 多個執行緒都要訪問臨界資源又要相互合作 執行緒間同時存在互斥關係和同步關係 2 執行緒a 先執行某操作 例如 對全域性變數x 的修改 後,執行緒b才能 根據變數x 的值判斷 執行另一操作 可能是 對全域性變數x 的修改 該...

執行緒的同步機制

1 執行緒安全與非執行緒安全 非執行緒安全是當多個執行緒訪問同乙個物件彙總的成員變數時產生的,產生的後果就是髒讀,就是指讀到的資料是被更改過的。而執行緒安全就是對獲取成員變數的值經過同步處理,不會再出現髒讀的現象。2 執行緒不安全的產生條件 a.存在多個執行緒 b.多個執行緒共享同乙個資源 c.對共...

Linux執行緒同步機制二 條件變數cond

一 條件變數基本原理 條件變數可以使執行緒睡眠等待某種條件出現。條件變數是利用執行緒間共享的全域性變數進行同步的一種機制,主要包括兩個動作 乙個執行緒等待 條件變數的條件成立 而掛起 另乙個執行緒使 條件成立 給出條件成立訊號 為了防止競爭,條件變數的使用總是和乙個互斥鎖結合在一起。二 條件變數操作...