Classe condition_variable

Use a classe condition_variable para aguardar um evento quando você tem um mutex do tipo unique_lock<mutex>. Os objetos desse tipo talvez tenham um desempenho melhor do que os objetos do tipo condition_variable_any<unique_lock<mutex>>.

Sintaxe

class condition_variable;

Membros

Construtores

Nome Descrição
condition_variable Constrói um objeto condition_variable.

Funções

Nome Descrição
native_handle Retorna o tipo específico da implementação que representa o identificador condition_variable.
notify_all Desbloqueia todos os threads que estão aguardando o objeto condition_variable.
notify_one Desbloqueia um dos threads que estão aguardando o objeto condition_variable.
wait Bloqueia um thread.
wait_for Bloqueia um thread e define um intervalo de tempo após o qual o thread será desbloqueado.
wait_until Bloqueia um thread e define um ponto máximo no tempo no qual o thread será desbloqueado.

condition_variable

Constrói um objeto condition_variable.

condition_variable();

Comentários

Se não tiver memória suficiente disponível, o construtor gerará um objeto system_error que tem um código de erro not_enough_memory. Se o objeto não puder ser criado porque algum outro recurso não está disponível, o construtor gerará um objeto system_error que tem um código de erro resource_unavailable_try_again.

native_handle

Retorna o tipo específico da implementação que representa o identificador condition_variable.

native_handle_type native_handle();

Valor de Devolução

native_handle_type é definido como um ponteiro para estruturas de dados internas do Runtime de Simultaneidade.

notify_all

Desbloqueia todos os threads que estão aguardando o objeto condition_variable.

void notify_all() noexcept;

notify_one

Desbloqueia um dos threads que estão aguardando o objeto condition_variable.

void notify_one() noexcept;

wait

Bloqueia um thread.

void wait(unique_lock<mutex>& Lck);

template <class Predicate>
void wait(unique_lock<mutex>& Lck, Predicate Pred);

Parâmetros

Lck
Um objeto unique_lock<mutex>.

Pred
Qualquer expressão que retorna true ou false.

Comentários

O primeiro método bloqueia até que o objeto condition_variable seja sinalizado por uma chamada para notify_one ou notify_all. Ela também pode ser ativada falsamente.

Na verdade, o segundo método executa o código a seguir.

while(!Pred())
    wait(Lck);

wait_for

Bloqueia um thread e define um intervalo de tempo após o qual o thread será desbloqueado.

template <class Rep, class Period>
cv_status wait_for(
    unique_lock<mutex>& Lck,
    const chrono::duration<Rep, Period>& Rel_time);

template <class Rep, class Period, class Predicate>
bool wait_for(
    unique_lock<mutex>& Lck,
    const chrono::duration<Rep, Period>& Rel_time,
    Predicate Pred);

Parâmetros

Lck
Um objeto unique_lock<mutex>.

Rel_time
Um objeto chrono::duration que especifica a quantidade de tempo antes que o thread seja ativado.

Pred
Qualquer expressão que retorna true ou false.

Valor de Devolução

O primeiro método retornará cv_status::timeout se a espera terminar quando tiver decorrido Rel_time. Do contrário, o método retorna cv_status::no_timeout.

O segundo método retorna o valor de Pred.

Comentários

O primeiro método bloqueia até que o objeto condition_variable seja sinalizado por uma chamada para notify_one ou notify_all ou até que o intervalo de tempo Rel_time tenha decorrido. Ela também pode ser ativada falsamente.

Na verdade, o segundo método executa o código a seguir.

while(!Pred())
    if(wait_for(Lck, Rel_time) == cv_status::timeout)
    return Pred();

return true;

wait_until

Bloqueia um thread e define um ponto máximo no tempo no qual o thread será desbloqueado.

template <class Clock, class Duration>
cv_status wait_until(
    unique_lock<mutex>& Lck,
    const chrono::time_point<Clock, Duration>& Abs_time);

template <class Clock, class Duration, class Predicate>
bool wait_until(
    unique_lock<mutex>& Lck,
    const chrono::time_point<Clock, Duration>& Abs_time,
    Predicate Pred);

cv_status wait_until(
    unique_lock<mutex>& Lck,
    const xtime* Abs_time);

template <class Predicate>
bool wait_until(
    unique_lock<mutex>& Lck,
    const xtime* Abs_time,
    Predicate Pred);

Parâmetros

Lck
Um objeto unique_lock<mutex>.

Abs_time
Um objeto chrono::time_point.

Pred
Qualquer expressão que retorna true ou false.

Valor de Devolução

Os métodos que retornam um tipo cv_status retornarão cv_status::timeout se a espera terminar quando Abs_time tiver decorrido. Caso contrário, os métodos retornarão cv_status::no_timeout.

Os métodos que retornam um bool retornarão o valor de Pred.

Comentários

O primeiro método bloqueia até que o objeto condition_variable seja sinalizado por uma chamada para notify_one ou notify_all ou até Abs_time. Ela também pode ser ativada falsamente.

Na verdade, o segundo método executa o código a seguir

while(!Pred())
    if(wait_until(Lck, Abs_time) == cv_status::timeout)
    return Pred();

return true;

O terceiro e o quarto métodos usam um ponteiro para um objeto do tipo xtime para substituir o objeto chrono::time_point. O objeto xtime especifica a quantidade máxima de tempo para esperar um sinal.

Confira também

Referência de Arquivos de Cabeçalho
<condition_variable>