View Full Version : pthread_cond_wait e pthread_cond_signal, domanda
MrProblema
30-05-2011, 16:00
Ciao a tutti,
ho scritto un programma che utilizza mutex e pthread_cond_wait e pthread_cond_signal. Ho solo una domanda: se il thread A manda il segnale S una sola volta con la pthread_cond_signal prima che il thread B sia arrivato a ad attenderlo alla sua pthread_cond_wait, cosa succede? B aspetterà in eterno un segnale che non arriverà mai perchè c'è già stato? Come funziona? Come potrei eventualmente far sì che lui continui a mandare signal con una soluzione abbastanza pulita (tipo senza un ciclo, se si può fare)?
Grazie,
Mr problema
rimane bloccato, per questo si usano i mutex, per rendere atomica la successione di if e wait
in teoria, se l'hai fatto correttamente, se c'è già stato una signal, la wait non dovrebbe essere fatta, perché la condizione è già verificata e non si entra nell'if
MrProblema
30-05-2011, 20:12
Era quello che pensavo anche io, se ho capito bene. Infatti se la signal è già arrivata, quando il secondo thread arriva alla wait, non dovrebbe fermarsi. Invece si bloccava ugualmente. C'è da dire che lanciando la signal non usavo dei mutex anche su di lei..forse era per quello? :( Diciamo che son riuscito a risolvere coi semafori...però la cosa mi è rimasta qui, sullo stomaco.
Era quello che pensavo anche io, se ho capito bene. Infatti se la signal è già arrivata, quando il secondo thread arriva alla wait, non dovrebbe fermarsi. Invece si bloccava ugualmente. C'è da dire che lanciando la signal non usavo dei mutex anche su di lei..forse era per quello? :( Diciamo che son riuscito a risolvere coi semafori...però la cosa mi è rimasta qui, sullo stomaco.non mi sono spiegato forse, se chiami la wait e non viene eseguita nessuna signal DOPO la wait, questa rimane bloccata, anche se la signal l'hai chiamata prima, il punto è che lo schema d'uso di una condition variable dovrebbe essere una cosa del tipo:
// Thread 1, quello che fa la wait
pthread_mutex_lock(&mutex); // Questo mutex serve a far sì che non avvenga la signal dopo l'if ma prima della wait, perché altirmenti il thread va in deadlock, oltre che a fare mutex sulla variabile condizione
if (!condizione)
{
pthread_cond_wait(&cond, &mutex);
}
pthread_mutex_unlock(&mutex);
// Thread 2, quello che segnala
pthread_mutex_lock(&mutex);
condizione = 1;
pthread_cond_signal(&cond);
pthread_mutex_unlock(&mutex);
quindi dovresti sempre avere un if, che deve essere eseguito solo se la signal non è stata ancora eseguita
MrProblema
31-05-2011, 08:14
Ok, grazie mille. Penso di aver capito ora :)
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.