Sto imparando pthread e condizioni di attesa. Per quanto posso dire una tipica thread in attesa è come questo:Pthread e condizioni di attesa
pthread_mutex_lock(&m);
while(!condition)
pthread_cond_wait(&cond, &m);
// Thread stuff here
pthread_mutex_unlock(&m);
Quello che non riesco a capire è perché la linea while(!condition)
è necessario, anche se io uso pthread_cond_signal()
per riattivare il thread.
posso capire che se uso pthread_cond_broadcast()
ho bisogno di testare condizione, perché mi sveglio tutte thread in attesa e uno di essi può rendere la condizione falsa nuovamente prima di sbloccare il mutex (e quindi trasferendo esecuzione all'altro risvegliato thread che non dovrebbe essere eseguito in quel punto). Ma se uso pthread_cond_signal()
Mi sveglio solo un thread quindi la condizione deve essere vera. Quindi il codice potrebbe essere il seguente:
pthread_mutex_lock(&m);
pthread_cond_wait(&cond, &m);
// Thread stuff here
pthread_mutex_unlock(&m);
Ho letto qualcosa sui segnali spuri che possono accadere. Questa è (e solo questa) la ragione? Perché dovrei avere dei nomi falsi? O c'è qualcos'altro che non capisco?
Suppongo che il codice di segnale è simile a questo:
pthread_mutex_lock(&m);
condition = true;
pthread_cond_signal(&cond); // Should wake up *one* thread
pthread_mutex_unlock(&m);
esattamente. up-votato. questo dovrebbe ottenere più attenzione rispetto alla risposta accettata. –