学习pthread的时候遇到一个问题,有点不是太确定的情况,先贴下代码
#include #include #include 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吗?
认证高级PHP讲师