POSIX 條件變數

2021-08-05 19:26:04 字數 2569 閱讀 2102

條件變數:條件變數是用來等待而不是用來上鎖的。條件變數用來自動阻塞乙個執行緒,直到某特殊情況發生為止。通常條件變數和互斥鎖同時使用。

因此, 當乙個執行緒互斥的訪問某個變數時,它可能發現在其它執行緒改變狀態之前,它什麼也做不了。例如乙個執行緒訪問佇列時,發現隊列為空時,他只能等待,直到其它執行緒將乙個節點新增到佇列中。這種情況就可以用到條件變數。

int pthread_cond_init(pthread_cond_t *cond,pthread_condattr_t *cond_attr);

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

int pthread_cond_timewait(pthread_cond_t *cond,pthread_mutex *mutex,const timespec *abstime);

int pthread_cond_destroy(pthread_cond_t *cond);

int pthread_cond_signal(pthread_cond_t *cond);

int pthread_cond_broadcast(pthread_cond_t *cond); //解除所有執行緒的阻塞

簡要說明:

(1)初始化.init()或者pthread_cond_t cond=pthread_cond_initialier;屬性置為null

(2)等待條件成立.pthread_wait,pthread_timewait.wait()釋放鎖,並阻塞等待條件變數為真

timewait()設定等待時間,仍未signal,返回etimeout(加鎖保證只有乙個執行緒wait)

(3)啟用條件變數:pthread_cond_signal,pthread_cond_broadcast(啟用所有等待執行緒)

(4)清除條件變數:destroy;無線程等待,否則返回ebusy

條件變數使用規範:

等待條件變數**:

pthread_mutex_lock(&mutex);

while (條件為假)

pthread_cond_wait(cond, mutex);

修改條件

pthread_mutex_unlock(&mutex);

給條件訊號傳送訊號**:

pthread_mutex_lock(&mutex);

while (條件為真);

pthread_cond_signal(cond, mutex);

修改條件

pthread_mutex_unlock(&mutex);

細節問題

pthread_cond_wait(&cond, &mutex);

內部完成了三件事:

1. 對mutex進行解鎖;2,等待條件,直到有執行緒向它發起通知;3,重新對mutex進行加鎖。

pthread_cond_signal(&cond);

向第乙個等待條件的執行緒發起通知,如果沒有任何乙個執行緒處於等待條件的狀態,這個通知將被忽略。

為什麼檢測條件用while而不是if?因為pthread_cond_wait會產生訊號,有兩種情況,一種是pthread_cond_wait會自動重啟,好像這個訊號沒有發生一樣,第二種pthread_cond_wait可能會被虛假喚醒,因此還需要重新判斷。

#include#include#include#include#include#include#include#include#include /* for o_* constants */

#include #define err_exit(m) dowhile(0)

#define consumer_count 2

#define producer_count 1

pthread_cond_t g_cond;

pthread_mutex_t g_mutex;

pthread_t g_thread[consumer_count+producer_count];

int nready=0;//

void* consume(void *arg)

printf("%d end wait a condtion...\n",n);

printf("%d begin consume\n",n);

--nready;

printf("%d end consume\n",n);

pthread_mutex_unlock(&g_mutex);

sleep(1);

}return null;

}void* produce(void *arg)

return null;

}int main()

{ pthread_cond_init(&g_cond,null);

pthread_mutex_init(&g_mutex,null);

int i=0;

for(i=0;i

POSIX條件變數

條件變數 1.當乙個執行緒互斥地訪問某個變數時,他可能發現其他執行緒改變狀態之前,他什麼也不做了 2.例如 乙個執行緒訪問佇列時,發現隊列為空,他只能等待,只到其他執行緒將乙個節點新增到佇列中,這種情況就需要用到條件變數 對於解決無界緩衝區比較好的選擇 函式 pthread cond init初始化...

POSIX 條件變數

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

POSIX執行緒 條件變數

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