2017-05-27 13 views
0

Quoting POSIX:Peut-on supposer que `pthread_cond_signal` réveillera atomiquement le thread signalé en ce qui concerne la liaison mutex à la variable de condition?

Les fonctions pthread_cond_broadcast() ou pthread_cond_signal() peuvent être appelés par un fil ou non elle possède actuellement le mutex que les threads appelant pthread_cond_wait() ou pthread_cond_timedwait() sont associés à la variable de condition pendant leur temps d'attente; Toutefois, si un comportement de planification prévisible est requis, ce mutex doit être verrouillé par le thread appelant pthread_cond_broadcast() ou pthread_cond_signal().

"Si un comportement de planification prévisible est requis". Cela pourrait indiquer que verrouiller le mutex lié à la variable de condition juste avant d'appeler pthread_cond_signal() devrait garantir que le thread signalé sera réveillé avant que tout autre thread ne parvienne à verrouiller ce mutex. Est-ce correct?

Répondre

0

Nous verrons si n'importe quel gourou de PThreads a une réponse plus complète, mais autant que je peux voir, au moins dans la page de manuel de Linux, vous n'obtenez pas un comportement entièrement prévisible. Ce que vous obtenez est une garantie que si deux threads attendent sur la même variable de condition, le thread supérieur-prio doit aller en premier (au moins, cela devrait être vrai sur Linux si un thread est SCHED_OTHER et l'autre est en temps réel SCHED_FIFO). Cela est valable si vous verrouillez mutex avant de signaler (avec une réserve d'erreurs après une lecture rapide de la page de manuel).

Voir https://linux.die.net/man/3/pthread_cond_signal

+0

Je recommande la page de manuel officielle de Linux ici: http://man7.org/linux/man-pages/man3/pthread_cond_signal.3p.html – alk

0

Non, il n'y a aucune garantie que le fil signalé sera réveillé. Pire encore, si dans le fil de signalisation que vous avez séquence:

while(run_again) { 
    pthread_mutex_lock(&mutex); 
    /* prepare data */ 
    pthread_mutex_unlock(&mutex); 
    pthread_cond_broadcast(&cond); 
} 

il y a un contrôle de chance raisonnable ne serait jamais passé à d'autres threads en attente sur mutex en raison de la logique dans le planificateur. Vous trouverez des exemples de jeux dans this answer.