互斥鎖和條件變數

2022-08-21 12:00:13 字數 2416 閱讀 8594

1.互斥鎖的存在問題:

互斥鎖乙個明顯的缺點是它只有兩種狀態:鎖定和非鎖定。設想一種簡單情景:多個執行緒訪問同乙個共享資源時,並不知道何時應該使用共享資源,如果在臨界區里加入判斷語句,或者可以有效,但一來效率不高,二來複雜環境下就難以編寫了,這是我們需要乙個結構,能在條件成立時觸發相應執行緒,進行變數修改和訪問。

2.條件變數:

條件變數通過允許執行緒阻塞和等待另乙個執行緒傳送訊號的方法彌補了互斥鎖的不足,它常和互斥鎖一起使用。使用時,條件變數被用來阻塞乙個執行緒,當條件不滿足時,執行緒往往解開相應的互斥鎖並等待條件發生變化。一旦其它的某個執行緒改變了條件變數,它將通知相應的條件變數喚醒乙個或多個正被此條件變數阻塞的執行緒。這些執行緒將重新鎖定互斥鎖並重新測試條件是否滿足。

3.條件變數的相關函式

標頭檔案:#include

pthread_cond_t cond = pthread_cond_initializer; //條件變數結構

int    pthread_cond_init(pthread_cond_t    *cond,& ;nbsp;   pthread_condattr_t

*cond_attr);

int pthread_cond_signal(pthread_cond_t *cond);

int pthread_cond_broadcast(pthread_cond_t *cond);

int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex);

int   pthread_cond_timedwait(pthread_cond_t   *cond,    pthread_mutex_t

*mutex, const struct timespec *abstime);

int pthread_cond_destroy(pthread_cond_t *cond);

詳細說明:

(1)建立和登出

條件變數和互斥鎖一樣,都有靜態動態兩種建立方式

a.靜態方式

靜態方式使用pthread_cond_initializer常量,如下:

pthread_cond_t cond=pthread_cond_initializer

b.動態方式

動態方式呼叫pthread_cond_init()函式,api定義如下:

int pthread_cond_init(pthread_cond_t *cond, pthread_condattr_t *cond_attr)

儘管posix標準中為條件變數定義了屬性,但在linuxthreads中沒有實現,因此cond_attr值通常為null,且被忽略。

登出乙個條件變數需要呼叫pthread_cond_destroy(),只有在沒有執行緒在該條件變數上等待的時候才能登出這個條件變數,否則返回ebusy。因為linux實現的條件變數沒有分配什麼資源,所以登出動作只包括檢查是否有等待執行緒。api定義如下:

int pthread_cond_destroy(pthread_cond_t *cond)

(2)等待和激發

a.等待

int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex)//等待

int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex, const struct timespec *abstime)//有時等待

等待條件有兩種方式:無條件等待pthread_cond_wait()和計時等待pthread_cond_timedwait(),其中計時等待方式如果在給定時刻前條件沒有滿足,則返回etimeout,結束等待,其中abstime以與time()系統呼叫相同意義的絕對時間形式出現,0表示格林尼治時間2023年1月1日0時0分0秒。

b.激發

激發條件有兩種形式,pthread_cond_signal()啟用乙個等待該條件的執行緒,存在多個等待執行緒時按入隊順序啟用其中乙個;而pthread_cond_broadcast()則啟用所有等待執行緒。

(3). 其他操作

pthread_cond_wait ()和pthread_cond_timedwait()都被實現為取消點,因此,在該處等待的執行緒將立即重新執行,在重新鎖定mutex後離開 pthread_cond_wait(),然後執行取消動作。也就是說如果pthread_cond_wait()被取消,mutex是保持鎖定狀態的,因而需要定義退出**函式來為其解鎖。

互斥鎖和條件變數

互斥瑣 定義 指代相互排斥,最基本的同步形式。用於保護臨界區,以保證任何時刻只有乙個執行緒或乙個程序在執行其中的 上鎖 pthread mutex lock 臨界區解鎖 pthread mutex unlock 條件變數 定義 用於等待訊號,同步的另一種手段。每乙個條件變數總有乙個互斥瑣與之關聯。等...

互斥鎖和條件變數

mutex體現的是一種競爭,我離開了,通知你進來。cond體現的是一種協作,我準備好了,通知你開始吧。互斥鎖乙個明顯的缺點是它只有兩種狀態 鎖定和非鎖定。而條件變數通過允許執行緒阻塞和等待另乙個執行緒傳送訊號的方法彌補了互斥鎖的不足,它常和互斥鎖一起配合使用。使用時,條件變數被用來阻塞乙個執行緒,當...

互斥鎖和條件變數

條件變數 執行緒最大的特點就是資源的共享性,然而資源共享中的同步問題是多執行緒程式設計的難點。互斥鎖通過鎖機制來實現執行緒間的同步。使用互斥鎖前必須進行初始化操作。初始化有兩種方式 一種是靜態賦值法,將將巨集結構常量pthread mutex initializer賦給互斥鎖,操作語句如下 pthr...