執行緒中的條件變數pthread_cond_wait、pthread_cond_signal
執行緒中的條件變數pthread_cond_wait、pthread_cond_signal
[@more@]條件變數是利用執行緒間共享的全域性變數進行同步的一種機制,主要包括兩個動作:一個執行緒等待 "條件變數的條件成立 "而掛起;另一個執行緒使 "條件成立 "(給出條件成立訊號)。為了防止競爭,條件變數的使用總是和一個互斥鎖結合在一起。
1.建立和登出
條件變數和互斥鎖一樣,都有靜態動態兩種建立方式,靜態方式使用PTHREAD_COND_INITIALIZER常量,如下:
pthread_cond_t cond=PTHREAD_COND_INITIALIZER
動態方式呼叫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.等待和激發
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表示格林尼治時間1970年1月1日0時0分0秒。
無論哪種等待方式,都必須和一個互斥鎖配合,以防止多個執行緒同時請求pthread_cond_wait()(或pthread_cond_timedwait(),下同)的競爭條件(Race Condition)。mutex互斥鎖必須是普通鎖(PTHREAD_MUTEX_TIMED_NP)或者適應鎖(PTHREAD_MUTEX_ADAPTIVE_NP),且在呼叫pthread_cond_wait()前必須由本執行緒加鎖(pthread_mutex_lock()),而在更新條件等待佇列以前,mutex保持鎖定狀態,並線上程掛起進入等待前解鎖。在條件滿足從而離開pthread_cond_wait()之前,mutex將被重新加鎖,以與進入pthread_cond_wait()前的加鎖動作對應。
激發條件有兩種形式,pthread_cond_signal()啟用一個等待該條件的執行緒,存在多個等待執行緒時按入隊順序啟用其中一個;而pthread_cond_broadcast()則啟用所有等待執行緒。
3.其他
pthread_cond_wait()和pthread_cond_timedwait()都被實現為取消點,因此,在該處等待的執行緒將立即重新執行,在重新鎖定mutex後離開pthread_cond_wait(),然後執行取消動作。也就是說如果pthread_cond_wait()被取消,mutex是保持鎖定狀態的,因而需要定義退出回撥函式來為其解鎖。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23168012/viewspace-1045828/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 多執行緒(2)-執行緒同步條件變數執行緒變數
- 多執行緒06:條件變數執行緒變數
- C++11 中的執行緒、鎖和條件變數C++執行緒變數
- Python執行緒條件變數Condition解析Python執行緒變數
- Python執行緒專題7:條件變數Python執行緒變數
- 多執行緒程式設計介紹-條件變數執行緒程式設計變數
- 如何使用ReentrantLock的條件變數,讓多個執行緒順序執行?ReentrantLock變數執行緒
- python多執行緒程式設計5: 條件變數同步Python執行緒程式設計變數
- Linux Qt使用POSIX多執行緒條件變數、互斥鎖(量)LinuxQT執行緒變數
- C++中的條件變數C++變數
- 【C/C++多執行緒程式設計之八】pthread條件變數C++執行緒程式設計thread變數
- linux多執行緒-----同步機制(互斥量、讀寫鎖、條件變數)Linux執行緒變數
- linux多執行緒-----同步物件(互斥量、讀寫鎖、條件變數)的屬性Linux執行緒物件變數
- 多執行緒中的使用共享變數的問題執行緒變數
- Java執行緒(篇外篇):執行緒本地變數ThreadLocalJava執行緒變數thread
- 二、(LINUX 執行緒同步) 互斥量、條件變數以及生產者消費者問題Linux執行緒變數
- Condition條件變數變數
- pthread 條件變數thread變數
- 關於條件變數變數
- MySQL 變數和條件MySql變數
- java多執行緒與併發 - Condition(條件)Java執行緒
- 04 Windows批處理中的條件執行Windows
- Linux多執行緒消費者和生產者模型例項(互斥鎖和條件變數使用)Linux執行緒模型變數
- 執行緒安全(三個條件)Synchronzied,wait和notify執行緒AI
- 解決多執行緒競爭條件——臨界區執行緒
- Java併發和多執行緒3:執行緒排程和有條件取消排程Java執行緒
- 使用channel代替條件變數變數
- 秒懂 Golang 中的 條件變數(sync.Cond)Golang變數
- 多執行緒與併發-----條件阻塞Condition的應用執行緒
- Java多執行緒/併發12、多執行緒訪問static變數Java執行緒變數
- SQL Server解惑——查詢條件IN中能否使用變數SQLServer變數
- 執行緒組之間的JMeter傳遞變數執行緒JMeter變數
- Java併發(十七)----變數的執行緒安全分析Java變數執行緒
- Oracle中where子句中條件的物理執行順序Oracle
- linux中條件變數和訊號量的區別!Linux變數
- 多執行緒中,區域性變數與全域性變數哪個比較安全?執行緒變數
- ARM技術 —— 條件執行
- linux 條件變數詳解Linux變數