std::latch
De cppreference.com
<tbody>
</tbody>
| 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.
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) |
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
Véase también
(C++20) |
Barrera de hilos reutilizable. (plantilla de clase) |