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::size
garantiu 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::empty
provavelmente retorna algo como size_ == 0
, e a leitura e gravação simultâneas size_
causariam corrida de dados, portanto, UB.