搜索

首页  >  问答  >  正文

linux - pthread中cond问题

学习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中文网2702 天前861

全部回复(1)我来回复

  • 女神的闺蜜爱上我

    女神的闺蜜爱上我2017-06-30 09:58:48

    pthread_cond_signal() 函数应至少解锁一个在指定条件变量 cond 上被阻塞的线程(如果有线程在 cond 上被阻塞)。死吧

    不能唤醒。

    回复
    0
  • 取消回复