L'appel de pthread_cond_signal sans signalisation de compromission du mutex ?
Certaines publications suggèrent que l'appel de pthread_cond_signal nécessite de verrouiller le mutex au préalable et de le déverrouiller par la suite. Cependant, pouvez-vous appeler pthread_cond_signal ou pthread_cond_broadcast sans verrouiller le mutex ?
Réponse :
Non, il est dangereux d'appeler pthread_cond_signal ou pthread_cond_broadcast sans d'abord verrouiller le mutex. Ceci est illustré à travers un exemple simple impliquant deux processus (A et B).
Processus A :
pthread_mutex_lock(&mutex); while (condition == FALSE) pthread_cond_wait(&cond, &mutex); pthread_mutex_unlock(&mutex);
Processus B (Incorrect) :
condition = TRUE; pthread_cond_signal(&cond);
Si la condition démarre comme FALSE et que le processus B tente de signaler sans verrouillage mutex, il est possible que le processus A manque le signal de réveil dû à un entrelacement d'instructions.
Processus B (Correct) :
pthread_mutex_lock(&mutex); condition = TRUE; pthread_cond_signal(&cond); pthread_mutex_unlock(&mutex);
Le verrouillage du mutex dans le processus B évite ce problème, garantissant que le processus A reçoit le signal de réveil.
Remarque : Bien qu'il soit techniquement possible de déplacer pthread_cond_signal() après pthread_mutex_unlock(), cela n'est pas recommandé car cela réduit l'efficacité de la planification des threads.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!