std::latch
De cppreference.com
Definido en el archivo de encabezado <latch>
|
||
class latch; |
(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 de 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.
A diferencia de std::barrier, un hilo participante puede disminuir std::latch
más de una vez.
Contenido |
[editar] Funciones miembro
Construye un objeto latch (pestillo) (función miembro pública) | |
Destruye el objeto latch (pestillo) (función miembro pública) | |
operator= [eliminada] |
latch no es asignable. (función miembro pública) |
Decrementa el contador de una manera sin bloqueo (función miembro pública) | |
Prueba si el contador interno es igual a cero (función miembro pública) | |
Se bloquea hasta que el contador alcanza cero (función miembro pública) | |
Decrementa el contador y se bloquea hasta alcanzar cero (función miembro pública) | |
Constantes | |
[estático] |
El valor máximo del contador soportado por la implementación (función miembro estática pública) |
[editar] Ejemplo
Ejecuta este código
#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
[editar] Véase también
(C++20) |
Barrera de hilos reutilizable. (plantilla de clase) |