POSIX 條件變數

2021-08-03 14:20:55 字數 1793 閱讀 3726

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

(2)用於執行緒間同步共享資料的值。條件變數提供了一種執行緒間的通知機制:當某個共享資料達到某個值的時候,喚醒等待這個共享資料的執行緒。

(3)無界緩衝區

(4) 多個消費者可以同時等待這個變數,生產者可以操作這個變數

pthread_mutex_lock(&mutex);

while (條件為假)

修改條件

pthread_mutex_unlock(&mutex);

pthread_mutex_lock(&mutex);

設定條件為真

pthread_cond_signal(&cond);

pthread_mutex_unlock(&mutex);

(1)功能:初始化條件變數

(1)該函式可以用來摧毀所指定的條件變數,同時將會釋放所給它分配的資源。呼叫該函式的程序並不要求等待在引數所指定的條件變數上;

pthread_cond_wait原語完成三件事:

(1)對mutex解鎖;

(2)等待條件, 直到有執行緒向他傳送通知;

(3)當wait返回時, 再對mutex重新加鎖;

(1)pthread_cond_signal原語所完成的操作:

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

(2)pthread_cond_broadcast:

向所有等待在該條件上的執行緒傳送通知;

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

do \

while(0)

#define consumers_count 2

#define producers_count 5

pthread_mutex_t g_mutex;

pthread_cond_t g_cond;

pthread_t g_thread[consumers_count + producers_count];

//無界緩衝區

int nready = 0;//表示當前緩衝區產品個數

void* consume(void* arg)

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

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

--nready; // 消費產品

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

pthread_mutex_unlock(&g_mutex);

sleep(5);

} return null;

}void* produce(void* arg)

return null;

}int main(int argc, char* argv) {

int i;

pthread_mutex_init(&g_mutex, null);

pthread_cond_init(&g_cond, null);

for(i=0; i

POSIX條件變數

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

POSIX 條件變數

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

POSIX執行緒 條件變數

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