|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Junior Member
Iscritto dal: Jun 2010
Messaggi: 12
|
pthread_cond_wait e pthread_cond_signal, domanda
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 Ultima modifica di MrProblema : 30-05-2011 alle 16:04. |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Apr 2010
Città: Frosinone
Messaggi: 416
|
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 |
![]() |
![]() |
![]() |
#3 |
Junior Member
Iscritto dal: Jun 2010
Messaggi: 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?
![]() |
![]() |
![]() |
![]() |
#4 | |
Senior Member
Iscritto dal: Apr 2010
Città: Frosinone
Messaggi: 416
|
Quote:
Codice:
// 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); Codice:
// Thread 2, quello che segnala pthread_mutex_lock(&mutex); condizione = 1; pthread_cond_signal(&cond); pthread_mutex_unlock(&mutex); |
|
![]() |
![]() |
![]() |
#5 |
Junior Member
Iscritto dal: Jun 2010
Messaggi: 12
|
Ok, grazie mille. Penso di aver capito ora
![]() |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 04:50.