Linux学习之系统编程篇:条件变量(pthread_cond_init / wait / signal / broadcast / destroy)
一、條件變量的認識
(1)條件變量的引出:
各個線程訪問共享資源,比如說共享資源是一個空資源,那么,各線程的訪問其實都是無效訪問,因此需要一個機制,首先阻塞線程,以免其錯誤訪問,待條件滿足時(比如 共享資源不為空了),告知各線程開始訪問共享資源即,在不滿足某種條件下,我希望代碼阻塞一會,待滿足某種條件后,再讓各線程工作,所謂某種條件就是條件變量。
(2)條件變量不是鎖!但條件變量能夠阻塞線程。
(3)如何實現線程同步 :
與鎖配合使用:條件變量(引起阻塞)+ 互斥鎖(保護一塊共享數據)。
(4)條件變量的兩個動作:
條件不滿足,阻塞線程;
條件滿足,通知阻塞的線程開始工作 。
(5)條件變量的經典模型:生產者和消費者模型
二、條件變量的操作函數
條件變量函數的返回值都是:成功返回 0, 失敗直接返回錯誤號
pthread_cond_t cond; // 定義一個條件變量(condtion)(1)初始化一個條件變量
函數說明:
使用:
pthread_cond_init ( & cond, NULL);//參數 2 條件變量的屬性,一般傳 NULL(2)阻塞等待一個條件變量
函數說明:
使用:
pthread_cond_t cond // 初始化后的條件變量 pthread_mutex_t mutex; // 初始化后的互斥鎖 pthread_cond_wait(&cond, &mutex);作用:
1)阻塞等待條件變量 cond(參數 1)滿足
2.)釋放已掌握的互斥鎖,相當于 pthread_mutex_unlock(&mutex);
注意:前 2 步是原子操作
3)當被喚醒,pthread_cond_wait 函數返回時,解除阻塞
重新申請獲取互斥鎖 pthread_mutex_lock(&mutex);
此處的 3 個作用,其實本質是著“生產者消費者模型”的工作流程。如下圖所示:
消費者去消費,即訪問頭結點,因此在訪問頭結點前,先加互斥鎖,發現頭結點為空,此時由于條件變量,消費者被阻塞在此(等待生產者生產) 【pthread_cond_wait() 作用 1】,
此時,生產者生產,但遇到了消費者加的互斥鎖,按理說無法生產,因此,這里涉及【pthread_cond_wait() 作用 2】,會將消費者已掌握的互斥鎖解開,這樣就可以生產了,生產后,將互斥鎖饑解開,提醒消費者,已解除阻塞,但此時,消費者所加的互斥鎖已經解開了,因此,涉及【pthread_cond_wait() 作用 3】,當 pthread_cond_wait()被喚醒后,重新為消費者回復原上鎖狀態,解除阻塞后,消費者開始消費,當消費結束后,解鎖,讓其他消費者搶鎖。
(3)解除阻塞,喚醒線程
(4)銷毀條件變量
int pthread_cond_destroy(pthread_cond_t *cond);總結
以上是生活随笔為你收集整理的Linux学习之系统编程篇:条件变量(pthread_cond_init / wait / signal / broadcast / destroy)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网络层概述
- 下一篇: Linux学习之系统编程篇:使用条件变量