2012-11-16 6 views
5

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?

risposta

3

Ci potrebbe essere spurious wakeups o notify_one potrebbe svegliare più di un thread a causa di dettagli di implementazione, come già accennato.

Svegliare più thread non significa però che tutti possono accedere alla sezione protetta allo stesso tempo, significa solo che quando ThreadA rilascia il blocco, ThreadB (che si è svegliato insieme a ThreadA nell'esempio precedente) entra anche nella sezione protetta. A questo punto ThreadA ha già fatto il suo lavoro, quindi ThreadB non vedrà la variabile count nello stesso stato in cui è stata trovata da ThreadA.

Problemi correlati