std::latch - cppreference.com
De cppreference.com
| Definido en el archivo de encabezado |
||
|
|
(desde C++20) | |
La clase latch (pestillo) es un contador descendente de tipo std::ptrdiff_t que puede ser
utilizado para sincronizar hilos. El valor del contador se inicializa en la creación.
Los hilos pueden bloquearse en el pestillo hasta que el contador se reduzca a cero. No hay posibilidad de aumentar o restablecer el contador, lo que hace que el pestillo sea una barrera de un solo uso.
Las invocaciones simultáneas de las funciones miembro de std::latch, a excepción del destructor, no introducen carreras de datos.
Datos miembro
| Nombre | Definición |
counter
|
El contador interno. (objeto miembro solo de exposición*) |
Funciones miembro
Construye un objeto latch (pestillo) (función miembro pública) [editar] | |
Destruye el objeto latch (pestillo) (función miembro pública) [editar] | |
operator= [eliminada] |
latch no es asignable. (función miembro pública) |
| Decrementa el contador de una manera sin bloqueo (función miembro pública) [editar] | |
| Prueba si el contador interno es igual a cero (función miembro pública) [editar] | |
| Se bloquea hasta que el contador alcanza cero (función miembro pública) [editar] | |
| Decrementa el contador y se bloquea hasta alcanzar cero (función miembro pública) [editar] | |
Constantes | |
[estático] |
El valor máximo del contador soportado por la implementación (función miembro estática pública) [editar] |
Notes
| Macro de Prueba de característica | Valor | Estándar | Comentario |
|---|---|---|---|
__cpp_lib_latch |
201907L |
(C++20) | std::latch
|
Ejemplo
#include <functional> #include <iostream> #include <latch> #include <string> #include <thread> int main() { struct job { const std::string name; std::string product{"no ha trabajado"}; std::thread action{}; } jobs[] = {{"Ana"}, {"Beto"}, {"Carlos"}}; std::latch work_done{std::size(jobs)}; std::latch start_clean_up{1}; auto work = [&](job& my_job) { my_job.product = my_job.name + " ha trabajado"; work_done.count_down(); start_clean_up.wait(); my_job.product = my_job.name + " ha limpiado"; }; std::cout << "Trabajo iniciando... "; for (auto& job : jobs) { job.action = std::thread{work, std::ref(job)}; } work_done.wait(); std::cout << "listo:\n"; for (auto const& job : jobs) { std::cout << " " << job.product << '\n'; } std::cout << "Trabajadores limpiando... "; start_clean_up.count_down(); for (auto& job : jobs) { job.action.join(); } std::cout << "listo:\n"; for (auto const& job : jobs) { std::cout << " " << job.product << '\n'; } }
Salida:
Trabajo iniciando... listo: Ana ha trabajado Beto ha trabajado Carlos ha trabajado Trabajadores limpiando... listo: Ana ha limpiado Beto ha limpiado Carlos ha limpiado
Véase también
| Barrera de hilos reutilizable. (plantilla de clase) [editar] |