條件變數是用來通知共享資料狀態資訊的。
1.條件變數初始化兩種方式:
(1)靜態初始化
pthread_cond_t cond = pthread_cond_initializer;
**示例如下:
#include typedefstruct
my_struct_tag my_struct_t;
my_struct_t data =;
int main (int argc, char *ar**)
(2)動態初始化
int pthread_cond_init(pthread_cond_t *cond,pthread_condattr_t *condattr);
int pthread_cond_destroy(pthread_cond_t *cond);
**示例如下:
#include typedefstruct
my_struct_tag my_struct_t;
int main (int argc, char *ar**)
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,struct timespec *expiration);
當執行緒等待條件變數時,它必須將相關互斥量鎖住。在阻塞執行緒之前,條件變數等待操作將解鎖互斥量,而在重新返回執行緒之前,會再次鎖住互斥量。
3.喚醒條件變數
int pthread_cond_signal(pthread_cond_t *cond);
int pthread_cond_broadcast(pthread_cond_t *cond);
在傳送訊號時也必須鎖住互斥量,如果互斥量不被鎖住,任何執行緒可以在被喚醒執行緒之前鎖住互斥量。這將是乙個產生被攔截喚醒的根源。例如,乙個低優先順序的執行緒可能鎖住了互斥量,使高優先順序的執行緒無法被其他執行緒喚醒,延遲了高優先順序執行緒的排程。
4.需要在等待條件變數執行緒被喚醒後,檢測條件
(1)被攔截的喚醒:等待條件變數被喚醒並加鎖相關互斥量,若乙個其他執行緒獲得了互斥量,它可能在等待之前先檢查條件。由於條件為真,所以它不需等待,直接處理工作,當它解鎖時,已經沒有可做的工作了。我們的第乙個等待條件變數執行緒加鎖互斥量後,再次檢測條件,很有必要。
(2)鬆散的條件:使用不確定的條件時,迴圈檢測條件,**會更加健壯。
(3)假喚醒:在某些多處理器系統,會發生假喚醒的情況。
5.使用示例
主線程等待條件訊號2s,子執行緒睡眠1s,改變共享資料值,傳送訊號,主線程接收訊號,繼續執行。
#include#include#include
typedef
struct
cond_tag
cond_t;
cond_t data =;
void *thread_route(void *arg)
int main(void
) }
if(data.valid==1
)
pthread_mutex_unlock(&data.mutex);
return0;
}
POSIX執行緒 條件變數
條件變數是 posix 執行緒結構,可以讓您在遇到某些條件時 喚醒 執行緒。可以將它們看作是一種執行緒安全的訊號傳送。如果執行緒正在等待某個特定條件發生,它應該如何處理這種情況?它可以重複對互斥物件鎖定和解鎖,每次都會檢查共享資料結構,以查詢某個值。但這是在浪費時間和資源,而且這種繁忙查詢的效率非常...
POSIX執行緒 條件變數(一)
為什麼使用條件變數 condition variable 想想我們怎麼實現下面的場景 當執行緒a需要通知執行緒b某件事情已經準備好,我們該怎麼做?我們通常的做法是 設定乙個全域性變數v,如果執行緒a已經準備好了某件事,則把v設定為1 執行緒b則不停得檢測v,直到v變為1再繼續下面的操作。這種做法的缺...
POSIX條件變數
條件變數 1.當乙個執行緒互斥地訪問某個變數時,他可能發現其他執行緒改變狀態之前,他什麼也不做了 2.例如 乙個執行緒訪問佇列時,發現隊列為空,他只能等待,只到其他執行緒將乙個節點新增到佇列中,這種情況就需要用到條件變數 對於解決無界緩衝區比較好的選擇 函式 pthread cond init初始化...