Spec-Zone.ru › C++

std::latch

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

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

Одновременные вызовы методов класса std::latch, за исключением деструктора, не приводят к гонкам данных.

В отличие от std::barrier, std::latch может быть уменьшен участником потока более одного раза.

Члены

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

Примечания

Макрокоманда для проверки наличия функции Значение Std Функция
__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/w/cpp/thread/latch

Spec-Zone.ru

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