POSIX條件變數

2021-07-10 08:34:30 字數 1635 閱讀 7043

條件變數:

1.當乙個執行緒互斥地訪問某個變數時,他可能發現其他執行緒改變狀態之前,他什麼也不做了

2.例如:乙個執行緒訪問佇列時,發現隊列為空,他只能等待,只到其他執行緒將乙個節點新增到佇列中,這種情況就需要用到條件變數

對於解決無界緩衝區比較好的選擇

函式:

pthread_cond_init初始化乙個條件變數

pthread_cond_destroy 銷毀乙個條件變數

pthread_cond_wait在乙個條件上等待做三件事:1,對mutex進行解鎖,2,等待條件,直到有執行緒向他發起通知 3,,重新對mutex進行加鎖操作

pthread_cond_signal當乙個條件滿足時向乙個執行緒傳送訊號,如果沒有任何乙個執行緒處於等待執行緒條件的狀態,這個訊號將會被忽略

pthread_cond_broadcast向等待的所有等待的執行緒傳送通知

條件變數的使用規範:

等待條件**

pthread_mutex_lock(&mutex)

while(條件為假)//用while的原因:因為pthread_cond_wait會 被虛假喚醒,然而條件變數卻沒有改變,所以用while可以再次判定條件變數(另外他會自動重啟與while無關)

pthread_cond_wait(cond,mutex);

修改條件

pthread_mutex_unlock(&mutex)

給條件傳送訊號**

pthread_mutex_lock(&mutex)

設定條件為真

pthread_cond_signal(cond);

pthread_mutex_unlock(&mutex);

#include #include #include #include #include #include #include #include #include #include #define err_exit(m)\

do \

while(0)

#define consumers_count 2

#define producers_count 1

pthread_mutex_t g_mutex;

pthread_cond_t g_cont;

int iread;

pthread_t g_thread[consumers_count+producers_count];

void* produce(void* arg)

return null;

}void* consumer(void* arg)

iread--;

sleep(1);

pthread_mutex_unlock(&g_mutex);

} return null;

}int main()

for(i=0; i< consumers_count;i++)

for(i=0; i< producers_count+consumers_count;i++)

pthread_mutex_destroy(&g_mutex);

pthread_cond_destroy(&g_cont);

return 0;

}

POSIX 條件變數

1 當乙個執行緒互斥地訪問某個變數時,它可能發現在其它執行緒改變狀態之前,它什麼也做不了。例如 乙個執行緒訪問佇列時,發現隊列為空,它只能等待,直到其它執行緒將節點新增到佇列中。這種情況就需要用到條件變數。2 用於執行緒間同步共享資料的值。條件變數提供了一種執行緒間的通知機制 當某個共享資料達到某個...

POSIX 條件變數

條件變數 條件變數是用來等待而不是用來上鎖的。條件變數用來自動阻塞乙個執行緒,直到某特殊情況發生為止。通常條件變數和互斥鎖同時使用。因此,當乙個執行緒互斥的訪問某個變數時,它可能發現在其它執行緒改變狀態之前,它什麼也做不了。例如乙個執行緒訪問佇列時,發現隊列為空時,他只能等待,直到其它執行緒將乙個節...

POSIX執行緒 條件變數

條件變數是 posix 執行緒結構,可以讓您在遇到某些條件時 喚醒 執行緒。可以將它們看作是一種執行緒安全的訊號傳送。如果執行緒正在等待某個特定條件發生,它應該如何處理這種情況?它可以重複對互斥物件鎖定和解鎖,每次都會檢查共享資料結構,以查詢某個值。但這是在浪費時間和資源,而且這種繁忙查詢的效率非常...