(1)那麼pthread_cond_timedwait()
短(淺)解釋它是如何工作的。
1)與pthread_cond_timewait()關聯的互斥鎖應在函數調用之前鎖定。這是你的責任。否則,函數行爲是未定義的。
2)當程序將其控件傳遞給函數時,函數ATOMICALLY釋放相關的互斥量,使其他線程有機會獲取它。當你在等待時,互斥鎖被解鎖。解鎖它是功能責任。 如果函數實現不能這樣做,只有一個線程會處理關聯的互斥鎖。
3)當函數返回時,無論是作爲超時的結果還是作爲接收信號的結果,函數都會原子鎖定互斥鎖。鎖定互斥鎖是功能責任。
4)現在互斥體應該再次由您解鎖。
解釋中的「原子」一詞意味着函數本身是線程安全的。
(2)調用pthread_cond_broadcast()
與調用pthread_cond_broadcast信令()使得所有等待的線程醒來並開始處理一個接一個。用pthread_cond_signal()發信令只喚醒一個線程。用下面的代碼來「感受」你可能玩的概念,以說明這個想法。用pthread_cond_brodcast替換pthread_cons_signal。考慮到使用pthread_cons_signal時程序永遠不會終止:只有一個服務器線程獲取信號並從等待循環中退出。
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
int value = 0;
void* waiter(void* arg)
{
int* tid = (int*)arg;
printf("waiter started %d\n", *tid);
pthread_mutex_lock(&mutex);
while(value == 0)
{
pthread_cond_wait(&cond, &mutex);
}
sleep(10);
printf("waiter %d releases\n", *tid);
pthread_mutex_unlock(&mutex);
}
void* notifier(void* arg)
{
sleep(2);
pthread_mutex_lock(&mutex);
value = 1;
//pthread_cond_broadcast(&cond);
pthread_cond_signal(&cond);
pthread_mutex_unlock(&mutex);
}
int main(void)
{
pthread_t w1; // waiter
int tid1=1;
pthread_t w2; // waiter
int tid2=2;
pthread_t n1; // notifier
pthread_create(&w1, NULL, waiter, &tid1);
pthread_create(&w2, NULL, waiter, &tid2);
pthread_create(&n1, NULL, notifier, NULL);
pthread_join(w1, NULL);
pthread_join(w2, NULL);
pthread_join(n1, NULL);
return 0;
}