Ho studiato con attenzione la risposta accettata alla seguente domanda SO: C++0x has no semaphores? How to synchronize threads?Perché una condizione/implementazione mutex di un semaforo richiede un ciclo "while" nella sua funzione "wait()"?
Nell'implementazione del semaforo in quella risposta, qui è l'implementazione della funzione di wait()
:
void wait()
{
boost::mutex::scoped_lock lock(mutex_);
while(!count_)
condition_.wait(lock);
--count_;
}
sto cercando di capire lo scopo della condizione while(!count_)
.
La risposta a un'altra domanda SO (How does this implementation of semaphore work?) indica che quando notify_one()
viene chiamato sulla variabile condizione, che è possibile che PIU filo attesa a questa condizione variabile sarà svegliato - da qui la necessità per la Ciclo while
. Mi piacerebbe avere confermato questo - è la risposta completa e/o corretta, o ci sono altri motivi per cui il ciclo while
è necessario?
Se si attiva più di un thread, quale thread possiede il mutex? Più ci penso, più mi sembra mal definito se più di un thread può svegliarsi a causa di una singola chiamata a notify_one()
. Non sarebbe possibile che ENTRAMBI i thread svegliati vedano il valore count_
come superiore a 0 e proceda a entrambi i valori decrescenti count_
, risultando in un valore count_
inferiore a 0 e annullando lo scopo (e la correttezza) del semaforo?