Eu tenho uma lista que eu quero tópicos diferentes para pegar elementos. Para evitar o bloqueio do mutex que guarda a lista quando está vazio, eu verifico empty()antes de bloquear.
Tudo bem se a chamada para list::empty()não estiver correta 100% do tempo. Eu só quero evitar bater ou interromper chamadas list::push()e concorrentes list::pop().
Estou seguro de presumir que o VC ++ e o Gnu GCC às vezes vão empty()errar e nada pior?
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::sizegarantiu uma complexidade de tempo constante, o que basicamente significa que o tamanho (número de nós) precisa ser armazenado em uma variável separada; vamos chamá-lo size_. std::list::emptyprovavelmente retorna algo como size_ == 0, e a leitura e gravação simultâneas size_causariam corrida de dados, portanto, UB.