Ich bin beim Lernen von pthread auf ein Problem gestoßen, da ich mir nicht sicher bin, also werde ich zuerst den Code posten
#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");
}
Wenn Sie „sleep(1)“ auskommentieren, stecken Sie in endlosem Warten fest. Wenn Sie es hinzufügen (ich persönlich denke, es soll sicherstellen, dass ein anderer Thread bereits darauf wartet, vor dem Haupt-Thread-Signal aufzuwachen), können Sie zwei Protokollsätze normal ausgeben und beenden. Der Grund für dieses Phänomen kann darin liegen, dass ein Thread aufgrund von cond_wait in den Ruhezustand fällt. Kann er nach dem Ruhezustand nur durch das Signalisieren von cond aufgeweckt werden? Ich habe im Internet gesucht und konnte keinen Artikel finden, in dem dies ausdrücklich erwähnt wurde. Ich hoffe, Sie können mir einen Rat geben. Oder helfen Sie mir zu bestätigen, dass für einen Cond, vorausgesetzt, Thread A ruft zuerst cond_signal auf und dann B cond_wait aufruft, kann B geweckt werden?
不能唤醒。