首頁  >  問答  >  主體

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中文网2691 天前848

全部回覆(1)我來回復

  • 女神的闺蜜爱上我

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

    pthread_cond_signal() 函數應至少解鎖一個在指定條件變數 cond 上被阻塞的執行緒(如果有執行緒在 cond 上被阻塞)。死吧

    不能喚醒。

    回覆
    0
  • 取消回覆