J'ai rencontré un problème lorsque j'apprenais pthread, je n'en suis pas sûr, je vais donc d'abord publier le code
.#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");
}
Si vous commentez sleep(1), vous serez coincé dans une attente infinie. Si vous l'ajoutez (je pense personnellement que c'est pour vous assurer qu'un autre thread attend déjà de se réveiller avant le signal du thread principal), vous pouvez générer deux phrases de journal normalement et quitter. La raison de ce phénomène peut être comprise comme étant qu'un thread tombe en veille à cause de cond_wait. Peut-il être réveillé uniquement en signalant cond après s'être endormi ? J'ai cherché sur Internet et je n'ai trouvé aucun article qui le disait spécifiquement. J'espère que vous pourrez me donner quelques conseils. Ou aidez-moi à confirmer, pour un cond, en supposant que le thread A appelle d'abord cond_signal, puis B appelle cond_wait, B peut-il être réveillé ?
不能唤醒。