一.概述:
條件變量是線程同步的一種機制,它是通過一個條件,當條件滿足時,喚醒一個線程,但條件不滿足時,挂起該線程。由于同步是伴随着互斥的,是以條件變量一般都伴随着互斥鎖。
二.相關函數:
(1).cond:pthread_cond_t cond = PTHREAD_COND_INITIALIZER
cond是一個全局變量,和mutex一樣。
(2).pthread_cond_init函數:int pthread_cond_init(pthread_cond_t *restrict cond,
const pthread_condattr_t *restrict attr)
attr參數:用于初始化cond,NULL表示預設屬性。weiNULL時和聲明一個全局的cond一樣。
傳回值:成功傳回0,失敗傳回錯誤号。
PS:restrict,C語言中的一種類型限定符(TypeQualifiers),用于告訴編譯器,對象已經被指針所引用,不能通過除該指針外所有其他直接或間接的方式修改該對象的内容。
(3).phtread_cond_destroy函數:int pthread_cond_destroy(pthread_cond_t *cond)
函數功能:銷毀cond。
(4).pthread_cond_timedwait函數:int pthread_cond_timedwait(pthread_cond_t *restrict cond,
pthread_mutex_t *restrict mutex,
const struct timespaec *restrict abstime)
函數功能:将目前線程挂起,直到有信号将其喚醒或出現錯誤傳回。
sbstime參數:等待逾時時間,如果到達了abstime所指定的 時刻仍然沒有别的線程來喚醒目前線程,就傳回ETIMEDOUT。
(5).pthread_cond_wait函數:int pthread_cond_timedwait(pthread_cond_t *restrict cond,
pthread_mutex_t *restrict mutex)
(6).pthread_cond_signal函數:int pthread_cond_signal(pthread_cond_t *cond)
函數功能:發出一個信号給用cond等待挂起的線程,使之進入就緒态。
(7).pthread_cond_broadcastsignal函數:int pthread_cond_signal(pthread_cond_t *cond)
函數功能:發出一個信号給所有用cond等待挂起的線程,使它們都進入就緒态。
三.相關代碼:(生産者與消費者模型)(必須是生産者先生産,消費者再消費的順序)
在沒有加互斥鎖和條件變量之前:
執行結果:
<a href="http://s3.51cto.com/wyfs02/M00/7F/4D/wKioL1cZj16jCOs4AAA6xMMOTTA229.png" target="_blank"></a>
PS:可以看到結果為消費者先消費,而不是生産者先生産。
用互斥鎖和條件變量:
<a href="http://s5.51cto.com/wyfs02/M02/7F/4D/wKioL1cZlmfBE3JRAAA-bC2IiMk963.png" target="_blank"></a>
本文轉自 ye小灰灰 51CTO部落格,原文連結:http://blog.51cto.com/10704527/1766621,如需轉載請自行聯系原作者