posix多執行緒 條件變數

2021-09-08 01:17:50 字數 1742 閱讀 1628

條件變數是用來通知共享資料狀態資訊的。

1.條件變數初始化兩種方式:

(1)靜態初始化

pthread_cond_t cond = pthread_cond_initializer;

**示例如下:

#include typedef 

struct

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 typedef 

struct

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初始化...