<condition_variable>
Define as classes condition_variable e condition_variable_any usadas para criar objetos que aguardam uma condição se tornar verdadeira.
Esse cabeçalho usa ConcRT (Runtime de Simultaneidade) para que você possa usá-lo juntamente com outros mecanismos ConcRT. Para obter mais informações sobre o ConcRT, consulte Runtime de simultaneidade.
Requisitos
Cabeçalho:<condition_variable>
Namespace: std
Observação
No código compilado usando /clr, esse cabeçalho é bloqueado.
Comentários
Código que aguarda até que uma variável de condição também deva usar um mutex
. Um thread de chamada deve bloquear mutex
antes de chamar as funções que aguardam a variável de condição. O mutex
está bloqueado quando a função chamada é retornada. O mutex
não está bloqueado enquanto o thread aguarda a condição se tornar verdadeira. Portanto, para que não haja resultados imprevisíveis, cada thread que aguarda uma variável de condição deve usar o mesmo objeto mutex
.
Os objetos do tipo condition_variable_any
podem ser usados com um mutex de qualquer tipo. O tipo do mutex usado não precisa fornecer o método try_lock
. Os objetos do tipo condition_variable
podem ser usados com um mutex do tipo unique_lock<mutex>
. Os objetos desse tipo podem ser mais rápidos do que os objetos do tipo condition_variable_any<unique_lock<mutex>>
.
Para aguardar um evento, primeiro bloqueie o mutex e, em seguida, chame um dos métodos wait
na variável de condição. A chamada wait
é bloqueada até que outro thread sinalize a variável de condição.
Ativações falsas ocorrem quando os threads que estão aguardando variáveis de condição ficam desbloqueados sem as notificações adequadas. Para reconhecer essas ativações falsas, o código que aguarda uma condição se tornar verdadeira deverá verificar explicitamente essa condição quando o código retornar de uma função de espera. Geralmente, isso é feito usando um loop; é possível usar wait(unique_lock<mutex>& lock, Predicate pred)
para realizar esse loop para você.
while (condition is false)
wait for condition variable;
As classes condition_variable_any
e condition_variable
têm, cada uma, três métodos que aguardam uma condição.
wait
aguarda um período de tempo não associado.wait_until
aguarda até umtime
especificado.wait_for
aguarda umtime interval
especificado.
Cada um desses métodos tem duas versões sobrecarregadas. Um deles apenas aguarda e pode ser ativado falsamente. O outro usa um argumento de modelo adicional que define um predicado. O método não retorna até que o predicado seja true
.
Cada classe também tem dois métodos usados para notificar uma variável de condição de que sua condição é true
.
notify_one
ativa um dos threads que está aguardando a variável de condição.notify_all
ativa todos os threads que estão aguardando a variável de condição.
Funções e enumerações
void notify_all_at_thread_exit(condition_variable& cond, unique_lock<mutex> lk);
enum class cv_status { no_timeout, timeout };
Confira também
Referência de Arquivos de Cabeçalho
Classe condition_variable
Classe condition_variable_any