條件變數實現執行緒同步

2021-10-02 18:10:11 字數 1885 閱讀 5592

(1) 什麼是條件變數實現執行緒同步?

假如我們的程式中有兩個執行緒,乙個是生產者執行緒,另乙個是消費者執行緒,生產者執行緒每隔一段時間把資料寫入到緩衝區buffer中,而消費者執行緒則每隔一段時間從buffer中取出資料,為了避免兩個執行緒讀寫混亂,我們讓生產線執行緒寫完後再通知消費者來讀資料,那麼則可以用條件變數來實現執行緒的同步。

(2) 條件變數的兩個動作

條件不滿足: 阻塞執行緒

條件滿足: 通知阻塞的執行緒開始工作

(3) 條件變數的型別:

pthread_cond_t cond;
(4) 主要函式:

初始化乙個條件變數( 第二引數一般為null)

int pthread_cond_init(pthread_cond_t *restrict cond, const pthread_condattr_t *restrict attr);
銷毀乙個條件變數

int pthread_cond_destroy(pthread_cond_t *cond);
阻塞等待乙個條件變數

int pthread_cond_wait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex);
阻塞執行緒

將已經上鎖的mutex解鎖

解除阻塞後會對mutex加鎖

限時等待乙個條件變數

int pthread_cond_timedwait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex, const struct timespec *restrict abstime);
啟用乙個等待該條件的執行緒,存在多個等待執行緒時按入隊順序啟用其中乙個。

int pthread_cond_signal(pthread_cond_t *cond);
喚醒全部阻塞在條件變數上的執行緒

int pthread_cond_broadcast(pthread_cond_t *cond);
(5)注意事項

(5)示例

1.初始化條件變數和互斥鎖

pthread_mutex_init(&mutex, null);

pthread_cond_init(&cond, null);

(1)生產者執行緒

pthread_mutex_lock(&mutex);// 使用互斥鎖保護共享資料

對緩衝區buffer寫入操作

pthread_cond_signal(&cond);// 通知阻塞的消費者執行緒,資料寫入完畢,可以解除阻塞了

pthread_mutex_unlock(&mutex);

(2)消費者執行緒

pthread_mutex_lock(&mutex); //呼叫pthread_cond_wait前一般都會搭配pthread_mutex_lock

pthread_cond_wait(&cond, &mutex); //等待生產者執行緒的通知

從緩衝區buffer中讀出資料

pthread_mutex_unlock(&mutex); //解鎖

3.銷毀條件變數和互斥鎖

pthread_mutex_destroy(&mutex);

pthread_cond_destroy(&cond);

執行緒同步 條件變數

當我們需要控制對記憶體資源的訪問的時候,可以用一種簡單的加鎖的方法來控制,即互斥鎖。但互斥鎖有乙個明顯的缺點,就是它只有兩個狀態 鎖定和非鎖定。而條件變數通過允許執行緒阻塞和等待另乙個執行緒傳送訊號的方法彌補來互斥鎖的不足。條件變數通常和互斥鎖一起使用。使用過程 1.呼叫pthread mutex ...

執行緒同步 條件變數

1.問題引入 互斥鎖問題,假設現在有兩個資源a和b,乙個執行緒先拿a再拿b,另乙個則相反,這樣導致的問題就是死鎖,即兩個執行緒無休止的互相等待 include include include include pthread mutex t g mtxa pthread mutex initializ...

執行緒同步 條件變數

多執行緒中條件變數的使用 執行緒同步之條件變數 include include include include include include include include using namespace std 乙個簡單的緩衝區類 struct buffer bool full return f...