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::size
ha 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::empty
quindi probabilmente restituisce qualcosa come size_ == 0
, e la lettura e la scrittura simultanee size_
causerebbero la corsa dei dati, quindi, UB.