cppreference em relaçãostd::atomic<T>::wait
a:
void wait( T old, std::memory_order order = std::memory_order::seq_cst ) const noexcept;
Executa operações de espera atômica. Comporta-se como se executasse repetidamente os seguintes passos:
- Compare a representação de valor de this->load(order) com a de old. Se forem iguais, então bloqueia até que *this seja notificado por notify_one() ou notify_all(), ou o thread seja desbloqueado espuriosamente .
- Caso contrário, retorna.
Essas funções têm garantia de retornar somente se o valor tiver sido alterado, mesmo que a implementação subjacente desbloqueie falsamente .
Estou confuso. Preciso me preocupar com ativações espúrias (o que significa que
wait()
podem retornar mesmo que o valor esteja parado old
) ou não?
Você não precisa se preocupar com ativações espúrias.
wait()
não retornará se o valor ainda forold
.Isso é entendido pelo seguinte na documentação que você citou:
É mencionado que as etapas que o comportamento deve seguir (incluindo a possibilidade de despertar espúrio) são feitas repetidamente , então, mesmo que um despertar espúrio ocorra,
wait()
ele não retornará e continuará o loop comparando o resultado deload()
com o valor deold
.Só para deixar claro, a documentação menciona explicitamente que:
(ênfase minha)
Não pode. Se o thread for despertado espúrio, ele irá comparar novamente o valor e esperar novamente se não for alterado.