条件变量实现线程同步
(1) 什么是條件變量實(shí)現(xiàn)線程同步?
假如我們的程序中有兩個(gè)線程,一個(gè)是生產(chǎn)者線程,另一個(gè)是消費(fèi)者線程,生產(chǎn)者線程每隔一段時(shí)間把數(shù)據(jù)寫入到緩沖區(qū)buffer中,而消費(fèi)者線程則每隔一段時(shí)間從buffer中取出數(shù)據(jù),為了避免兩個(gè)線程讀寫混亂,我們讓生產(chǎn)線線程寫完后再通知消費(fèi)者來讀數(shù)據(jù),那么則可以用條件變量來實(shí)現(xiàn)線程的同步。
(2) 條件變量的兩個(gè)動作
條件不滿足: 阻塞線程
條件滿足: 通知阻塞的線程開始工作
(3) 條件變量的類型:
pthread_cond_t cond;(4) 主要函數(shù):
初始化一個(gè)條件變量(?第二參數(shù)一般為NULL)
銷毀一個(gè)條件變量
int pthread_cond_destroy(pthread_cond_t *cond);阻塞等待一個(gè)條件變量
int pthread_cond_wait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex);? ? ? ?阻塞線程
? ? ? ?將已經(jīng)上鎖的mutex解鎖
? ? ? ?解除阻塞后會對mutex加鎖
限時(shí)等待一個(gè)條件變量
int pthread_cond_timedwait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex, const struct timespec *restrict abstime);激活一個(gè)等待該條件的線程,存在多個(gè)等待線程時(shí)按入隊(duì)順序激活其中一個(gè)。
int pthread_cond_signal(pthread_cond_t *cond);喚醒全部阻塞在條件變量上的線程
int pthread_cond_broadcast(pthread_cond_t *cond);?
(5)注意事項(xiàng)
注意 1:
mutex 互斥鎖必須是普通鎖(PTHREAD_MUTEX_TIMED_NP)或者適應(yīng)鎖(PTHREAD_MUTEX_ADAPTIVE_NP)。
在調(diào)用 pthread_cond_wait()前必須由本線程加鎖 pthread_mutex_lock()。
在更新條件等待隊(duì)列以前,mutex 保持鎖定狀態(tài)。
在線程掛起進(jìn)入等待前解鎖。
注意 2:
在條件滿足從而離開 pthread_cond_wait() 之前,mutex 將被重新加鎖,以與進(jìn)入
pthread_cond_wait()前的加鎖動作對應(yīng)。
也就是說在做 pthread_cond_wait 之前,往往要用 pthread_mutex_lock 進(jìn)行加鎖,而
調(diào) pthread_cond_wait 函 數(shù) 會 將 鎖 解 開 , 然 后 將 線 程 掛 起 阻 塞 。 直 到 條 件 被
pthread_cond_signal 激發(fā),該函數(shù)內(nèi)部又會將鎖狀態(tài)恢復(fù)為鎖定狀態(tài),最后再用
pthread_mutex_unlock 進(jìn)行解鎖。
注意 3:
pthread_cond_wait() 和 pthread_cond_timedwait()都被實(shí)現(xiàn)為取消點(diǎn),也就是說如果
pthread_cond_wait()被取消,則退出阻塞,然后將鎖狀態(tài)恢復(fù),然后當(dāng)前線程就會終止。即
互斥鎖又恢復(fù)鎖定狀態(tài),然而當(dāng)前線程已經(jīng)被取消掉,那么這個(gè)互斥鎖就不會被解開了,此
時(shí)鎖得不到釋放,就會造成死鎖,因而需要在線程退出前為其解鎖。
?
(5)示例
1.初始化條件變量和互斥鎖pthread_mutex_init(&mutex, NULL);pthread_cond_init(&cond, NULL);2.在線程中使用 (1)生產(chǎn)者線程pthread_mutex_lock(&mutex);// 使用互斥鎖保護(hù)共享數(shù)據(jù)對緩沖區(qū)buffer寫入操作pthread_cond_signal(&cond);// 通知阻塞的消費(fèi)者線程,數(shù)據(jù)寫入完畢,可以解除阻塞了pthread_mutex_unlock(&mutex);(2)消費(fèi)者線程pthread_mutex_lock(&mutex); //調(diào)用pthread_cond_wait前一般都會搭配pthread_mutex_lockpthread_cond_wait(&cond, &mutex); //等待生產(chǎn)者線程的通知從緩沖區(qū)buffer中讀出數(shù)據(jù)pthread_mutex_unlock(&mutex); //解鎖3.銷毀條件變量和互斥鎖pthread_mutex_destroy(&mutex);pthread_cond_destroy(&cond);?
本文參考文章:
https://www.cnblogs.com/hesper/p/10738996.html
https://www.cnblogs.com/harlanc/p/8596211.html
?
總結(jié)
以上是生活随笔為你收集整理的条件变量实现线程同步的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 雪域迷城剧情介绍
- 下一篇: mjpg-streamer框架分析