std::condition_variable_any:: wait_for
|
template
<
class
Lock,
class
Rep,
class
Period
>
std::
cv_status
wait_for
(
Lock
&
lock,
|
(1) | (desde C++11) |
|
template
<
class
Lock,
class
Rep,
class
Period,
class
Predicate
>
bool
wait_for
(
Lock
&
lock,
const
std::
chrono
::
duration
<
Rep, Period
>
&
rel_time,
|
(2) | (desde C++11) |
|
template
<
class
Lock,
class
Rep,
class
Period,
class
Predicate
>
bool
wait_for
(
Lock
&
lock,
std::
stop_token
stoken,
|
(3) | (desde C++20) |
wait_for
hace que el hilo actual se bloquee hasta que la variable de condición sea notificada, haya transcurrido la duración dada, o ocurra un despertar espurio.
pred
puede proporcionarse opcionalmente para detectar despertar espurio.
std:: chrono :: steady_clock :: now ( ) + rel_time, std :: move ( pred ) ) ; .
Inmediatamente después de que
wait_for
retorne,
lock
está bloqueado por el hilo que realiza la llamada. Si esta postcondición no puede satisfacerse
[1]
, llama a
std::terminate
.
- ↑ Esto puede ocurrir si el re-bloqueo del mutex lanza una excepción.
Contenidos |
Parámetros
| lock | - | un lock que debe ser bloqueado por el hilo que llama |
| stoken | - | un token de parada para registrar la interrupción |
| rel_time | - | la duración máxima a esperar |
| pred | - | el predicado para verificar si la espera puede completarse |
| Requisitos de tipo | ||
-
Lock
debe cumplir con los requisitos de
BasicLockable
.
|
||
-
Predicate
debe cumplir con los requisitos de
FunctionObject
.
|
||
|
-
|
||
Valor de retorno
Excepciones
Notas
Aunque se notifique bajo bloqueo, la sobrecarga (1) no ofrece garantías sobre el estado del predicado asociado al retornar por tiempo de espera agotado.
Los efectos de
notify_one()
/
notify_all()
y cada una de las tres partes atómicas de
wait()
/
wait_for()
/
wait_until()
(desbloquear+esperar, despertar y bloquear) ocurren en un único orden total que puede verse como el
orden de modificación
de una variable atómica: el orden es específico de esta variable de condición individual. Esto hace imposible que
notify_one()
pueda, por ejemplo, retrasarse y desbloquear un hilo que comenzó a esperar justo después de que se realizara la llamada a
notify_one()
.
Ejemplo
#include <chrono> #include <condition_variable> #include <iostream> #include <thread> std::condition_variable_any cv; std::mutex cv_m; // Este mutex se utiliza para tres propósitos: // 1) sincronizar accesos a i // 2) sincronizar accesos a std::cerr // 3) para la variable de condición cv int i = 0; void waits() { std::unique_lock<std::mutex> lk(cv_m); std::cerr << "Esperando... \n"; cv.wait(lk, []{ return i == 1; }); std::cerr << "...finalizada la espera. i == 1\n"; } void signals() { std::this_thread::sleep_for(std::chrono::seconds(1)); { std::lock_guard<std::mutex> lk(cv_m); std::cerr << "Notificando...\n"; } cv.notify_all(); std::this_thread::sleep_for(std::chrono::seconds(1)); { std::lock_guard<std::mutex> lk(cv_m); i = 1; std::cerr << "Notificando de nuevo...\n"; } cv.notify_all(); } int main() { std::thread t1(waits), t2(waits), t3(waits), t4(signals); t1.join(); t2.join(); t3.join(); t4.join(); }
Salida posible:
Esperando... Esperando... Esperando... Notificando... Notificando de nuevo... ...finalizada la espera. i == 1 ...finalizada la espera. i == 1 ...finalizada la espera. i == 1
Informes de defectos
Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares publicados anteriormente de C++.
| DR | Se aplica a | Comportamiento publicado | Comportamiento correcto |
|---|---|---|---|
| LWG 2093 | C++11 | faltaban excepciones relacionadas con timeout en la especificación | menciona estas excepciones |
|
LWG 2114
( P2167R3 ) |
C++11 | la convertibilidad a bool era demasiado débil para reflejar las expectativas de las implementaciones | requisitos fortalecidos |
| LWG 2135 | C++11 | el comportamiento no estaba claro si lock. lock ( ) lanza una excepción | llama a std::terminate en este caso |
Véase también
|
bloquea el hilo actual hasta que la variable de condición sea activada
(función miembro pública) |
|
|
bloquea el hilo actual hasta que la variable de condición sea activada o hasta que se alcance el punto de tiempo especificado
(función miembro pública) |