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 retorno
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 retorno
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 retorno
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.