Spec-Zone.ru › C++

std::latch

Определён в заголовке <latch>
class latch;
(начиная с C++20)

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

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

Данные-члены

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

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

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

Примечания

Макрос проверки поддержки функции Значение Стандарт Функция
__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

См. также

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

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/thread/latch

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API