学习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 上被阻塞)。死吧