Espacios de nombres
Variantes
Acciones

std::latch

De cppreference.com
< cpp‎ | thread
 
 
Biblioteca de apoyo de concurrencia
Hilos
(C++11)
(C++20)
Espacio de nombres this_thread
(C++11)
(C++11)
(C++11)
Cancelación cooperativa
Exclusión mutua
(C++11)
Gestión genérica de bloqueo
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
Variables de condición
(C++11)
Semáforos
Pestillos y barreras
latch
(C++20)
(C++20)
Futuros
(C++11)
(C++11)
(C++11)
(C++11)
Recuperación segura
(C++26)
Punteros de riesgo
Tipos atómicos
(C++11)
(C++20)
Inicialización de tipos atómicos
(C++11)(en desuso en C++20)
(C++11)(en desuso en C++20)
Orden de memoria
Funciones independientes para operaciones atómicas
Funciones independientes para indicadores atómicos
 
 
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) [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]

[editar] 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

[editar] Véase también

(C++20)
Barrera de hilos reutilizable.
(plantilla de clase) [editar]