Ho un elenco da cui voglio thread diversi per prendere elementi. Per evitare di bloccare il mutex a guardia dell'elenco quando è vuoto, controllo empty()prima del blocco.
Va bene se la chiamata a list::empty()non è corretta al 100% delle volte. Voglio solo evitare arresti anomali o interruzioni simultanee list::push()e list::pop()chiamate.
Sono sicuro di presumere che VC ++ e Gnu GCC a volte empty()sbaglieranno e niente di peggio?
if(list.empty() == false){ // unprotected by mutex, okay if incorrect sometimes
mutex.lock();
if(list.empty() == false){ // check again while locked to be certain
element = list.back();
list.pop_back();
}
mutex.unlock();
}
std::list::sizeha garantito una complessità temporale costante, il che significa sostanzialmente che la dimensione (numero di nodi) deve essere memorizzata in una variabile separata; chiamiamolo size_. std::list::emptyquindi probabilmente restituisce qualcosa come size_ == 0, e la lettura e la scrittura simultanee size_causerebbero la corsa dei dati, quindi, UB.