Per citare la pagina man:
Quando si utilizzano le variabili di condizione, esiste sempre un predicato booleano che coinvolge le variabili condivise associate a ciascuna condizione di attesa, che è vero se il thread deve procedere. Possono verificarsi attivazioni spurie dalle funzioni pthread_cond_timedwait () o pthread_cond_wait (). Poiché il ritorno da pthread_cond_timedwait () o pthread_cond_wait () non implica nulla riguardo al valore di questo predicato, il predicato dovrebbe essere rivalutato su tale ritorno.
Quindi, pthread_cond_wait
può tornare anche se non lo hai segnalato. Almeno a prima vista, sembra abbastanza atroce. Sarebbe come una funzione che ha restituito in modo casuale il valore errato o restituito in modo casuale prima che raggiungesse effettivamente un'istruzione di ritorno corretta. Sembra un grosso errore. Ma il fatto che abbiano scelto di documentare questo nella pagina man piuttosto che risolverlo sembrerebbe indicare che esiste un motivo legittimo per cui pthread_cond_wait
finisce per svegliarsi spuri. Presumibilmente, c'è qualcosa di intrinseco nel modo in cui funziona che lo rende in modo che non possa essere aiutato. La domanda è cosa.
Perché non pthread_cond_wait
tornare spurio? Perché non può garantire che si sveglierà solo quando è stato correttamente segnalato? Qualcuno può spiegare il motivo del suo comportamento spurio?
pthread_cond_(timed)wait
: "Se viene inviato un segnale ... il thread riprende in attesa della variabile di condizione come se fosse non interrotto o restituirà zero a causa di un risveglio spurio ". Altre funzioni di blocco indicano EINTR
quando sono interrotte da un segnale (ad es. read
) O sono richieste per riprendere (ad es pthread_mutex_lock
.). Quindi se non ci fossero altre ragioni per un risveglio spurio, si pthread_cond_wait
sarebbe potuto definire come uno di questi.