學習pthread的時候遇到一個問題,有點不是太確定的情況,先貼下程式碼
#include <pthread.h>
#include <stdio.h>#include <unistd.h>
pthread_cond_t cond;
pthread_mutex_t mutex;
void *Test(void *arg) {
pthread_mutex_lock(&mutex);
while (1) {
pthread_cond_wait(&cond, &mutex);
printf("Got notified\n");
break;
}
pthread_mutex_unlock(&mutex);
return NULL;
}
int main() {
pthread_cond_init(&cond, NULL);
pthread_mutex_init(&mutex, NULL);
pthread_t t;
pthread_create(&t, NULL, Test, NULL);
sleep(1);
pthread_mutex_lock(&mutex);
pthread_cond_signal(&cond);
pthread_mutex_unlock(&mutex);
pthread_join(t, NULL);
printf("Exit\n");
}
如果將sleep(1)註解掉,就會陷入無限的等待。如果加上(個人認為是確保在主執行緒signal的之前另一個執行緒已經在等待喚醒),就可以正常的輸出兩句log,並且退出。這個現象的原因可以理解為是因為一個執行緒因為cond_wait陷入睡眠,只有在它睡眠後對cond進行signal才能喚醒嗎?網路上找了一下沒有找到說的特別明確的文章。希望可以指點一下。或者說幫我確認一下,對於一個cond,假設線程A先呼叫了cond_signal,而之後B才呼叫了cond_wait,可以喚醒B嗎?
女神的闺蜜爱上我2017-06-30 09:58:48
不能喚醒。pthread_cond_signal() 函數應至少解鎖一個在指定條件變數 cond 上被阻塞的執行緒(如果有執行緒在 cond 上被阻塞)。死吧