Classe condition_variable_any
Use a classe condition_variable_any
para aguardar um evento que tem qualquer tipo mutex
.
Sintaxe
class condition_variable_any;
Membros
Construtores
Nome | Descrição |
---|---|
condition_variable_any | Constrói um objeto condition_variable_any . |
Funções
Nome | Descrição |
---|---|
notify_all | Desbloqueia todos os threads que estão aguardando o objeto condition_variable_any . |
notify_one | Desbloqueia um dos threads que estão aguardando o objeto condition_variable_any . |
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_any
Constrói um objeto condition_variable_any
.
condition_variable_any();
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
.
notify_all
Desbloqueia todos os threads que estão aguardando o objeto condition_variable_any
.
void notify_all() noexcept;
notify_one
Desbloqueia um dos threads que estão aguardando o objeto condition_variable_any
.
void notify_one() noexcept;
wait
Bloqueia um thread.
template <class Lock>
void wait(Lock& Lck);
template <class Lock, class Predicate>
void wait(Lock& Lck, Predicate Pred);
Parâmetros
Lck
Um objeto mutex
de qualquer tipo.
Pred
Qualquer expressão que retorna true
ou false
.
Comentários
O primeiro método bloqueia até que o objeto condition_variable_any
seja sinalizado por uma chamada para notify_one ou notify_all. Ela também pode ser ativada falsamente.
O segundo método, na verdade, 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 Lock, class Rep, class Period>
bool wait_for(Lock& Lck, const chrono::duration<Rep, Period>& Rel_time);
template <class Lock, class Rep, class Period, class Predicate>
bool wait_for(Lock& Lck, const chrono::duration<Rep, Period>& Rel_time, Predicate Pred);
Parâmetros
Lck
Um objeto mutex
de qualquer tipo.
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_any
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.
O segundo método, na verdade, 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 Lock, class Clock, class Duration>
void wait_until(Lock& Lck, const chrono::time_point<Clock, Duration>& Abs_time);
template <class Lock, class Clock, class Duration, class Predicate>
void wait_until(
Lock& Lck,
const chrono::time_point<Clock, Duration>& Abs_time,
Predicate Pred);
template <class Lock>
void wait_until(Lock Lck, const xtime* Abs_time);
template <class Lock, class Predicate>
void wait_until(
Lock Lck,
const xtime* Abs_time,
Predicate Pred);
Parâmetros
Lck
Um objeto 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.
O segundo método, na verdade, 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.