linux - pthread中cond问题
PHP中文网
PHP中文网 2017-06-30 09:56:48
0
1
689

学习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吗?

PHP中文网
PHP中文网

认证高级PHP讲师

Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!