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 {conststd::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(autoconst& 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(autoconst& 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) |