Domanda

Ho filettato 1 Esecuzione del seguente codice:

unique_lock<mutex> ul(m);
while(condition == true)
    cv.wait(ul);
.

e Thread 2 Esecuzione di questo codice:

condition = false;
cv.notify_one();
.

Sfortunatamente sto colpendo un problema di temporizzazione:

T1: condition checks true
                            T2: condition set to false
                            T2: cv.notify_one()
T1: cv.wait()
.

Discussione 1 Manca completamente la notifica e rimane bloccata in attesa ().Ho provato a utilizzare la versione di attesa () che prende un predicato ma con essenzialmente lo stesso risultato.Cioè, il corpo del predicato esegue il controllo, ma prima che ritorni, il valore della condizione viene modificato e la notifica viene inviata.Il predicato quindi ritorna.

Come posso risolvere questo?

È stato utile?

Soluzione

È necessario correggere questa condizione di gara con il filo 2 bloccare il mutex della condizione prima di cambiare la bandiera.

Stai descrivendo una tipica condizione di gara che accade per flag e condizioni non protetti.Queste condizioni di razza sono la ragione del modello di blocco del mutex nell'utilizzo delle condizioni.Metti semplicemente, avere sempre un mutex proteggere le variabili coinvolte nel controllo di un valore di condizione.

In codice per filo 2:

unique_lock<mutex> ul(m);
condition = false;
cv.notify_one();
.

Altri suggerimenti

Hai un Gara dati a causa dell'accesso in conflitto di lettura / scrittura a condition.Ciò implica che il comportamento del tuo programma non è definito .

La condizione di gara su cv è l'ultima delle tue preoccupazioni: il programma potrebbe fare qualsiasi cosa!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top