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