Namespaces
Variants

std:: latch

From cppreference.net
Concurrency support library
Threads
(C++11)
(C++20)
this_thread namespace
(C++11)
(C++11)
Cooperative cancellation
Mutual exclusion
Generic lock management
Condition variables
(C++11)
Semaphores
Latches and Barriers
latch
(C++20)
(C++20)
Futures
(C++11)
(C++11)
(C++11)
Safe reclamation
Hazard pointers
Atomic types
(C++11)
(C++20)
Initialization of atomic types
(C++11) (deprecated in C++20)
(C++11) (deprecated in C++20)
Memory ordering
(C++11) (deprecated in C++26)
Free functions for atomic operations
Free functions for atomic flags
Определено в заголовке <latch>
class latch ;
(начиная с C++20)

Класс latch представляет собой нисходящий счетчик типа std::ptrdiff_t , который может использоваться для синхронизации потоков. Значение счетчика инициализируется при создании. Потоки могут блокироваться на latch до тех пор, пока счетчик не уменьшится до нуля. Невозможность увеличения или сброса счетчика делает latch барьером одноразового использования.

Параллельные вызовы функций-членов std::latch , за исключением деструктора, не приводят к состоянию гонки данных.

Содержание

Члены данных

Название Определение
std::ptrdiff_t counter внутренний счётчик
( объект-член только для демонстрации* )

Функции-члены

создаёт latch
(публичная функция-член)
уничтожает latch
(публичная функция-член)
operator=
[deleted]
latch не может быть присвоен
(публичная функция-член)
уменьшает счётчик в неблокирующем режиме
(публичная функция-член)
проверяет, равен ли внутренний счётчик нулю
(публичная функция-член)
блокирует до тех пор, пока счётчик не достигнет нуля
(публичная функция-член)
уменьшает счётчик и блокирует до тех пор, пока он не достигнет нуля
(публичная функция-член)
Константы
[static]
максимальное значение счётчика, поддерживаемое реализацией
(публичная статическая функция-член)

Примечания

Макрос тестирования возможностей Значение Стандарт Функция
__cpp_lib_latch 201907L (C++20) std::latch

Пример

#include <functional>
#include <iostream>
#include <latch>
#include <string>
#include <thread>
struct Job
{
    const std::string name;
    std::string product{"not worked"};
    std::thread action{};
};
int main()
{
    Job jobs[]{{"Annika"}, {"Buru"}, {"Chuck"}};
    std::latch work_done{std::size(jobs)};
    std::latch start_clean_up{1};
    auto work = [&](Job& my_job)
    {
        my_job.product = my_job.name + " worked";
        work_done.count_down();
        start_clean_up.wait();
        my_job.product = my_job.name + " cleaned";
    };
    std::cout << "Work is starting... ";
    for (auto& job : jobs)
        job.action = std::thread{work, std::ref(job)};
    work_done.wait();
    std::cout << "done:\n";
    for (auto const& job : jobs)
        std::cout << "  " << job.product << '\n';
    std::cout << "Workers are cleaning up... ";
    start_clean_up.count_down();
    for (auto& job : jobs)
        job.action.join();
    std::cout << "done:\n";
    for (auto const& job : jobs)
        std::cout << "  " << job.product << '\n';
}

Вывод:

Work is starting... done:
  Annika worked
  Buru worked
  Chuck worked
Workers are cleaning up... done:
  Annika cleaned
  Buru cleaned
  Chuck cleaned

Смотрите также

(C++20)
многоразовый барьер потоков
(шаблон класса)