std::latch
Определён в заголовке <latch> | ||
|---|---|---|
class latch; | (начиная с C++20) |
Класс latch представляет собой убывающий счётчик типа std::ptrdiff_t, который можно использовать для синхронизации потоков. Значение счётчика инициализируется при создании. Потоки могут блокироваться на защёлке, пока счётчик не будет уменьшен до нуля. Увеличить или сбросить счётчик невозможно, поэтому защёлка является одноразовым барьером.
Параллельные вызовы функций-членов std::latch, за исключением деструктора, не приводят к гонкам данных.
Данные-члены
| Имя | Определение |
|---|---|
std::ptrdiff_t counter | внутренний счётчик (объект-член, используемый только для иллюстрации*) |
Функции-члены
создаёт latch (открытая функция-член) |
|
уничтожает latch (открытая функция-член) |
|
|
operator=
[удалён] |
latch нельзя присваивать (открытая функция-член) |
| уменьшает счётчик без блокировки (открытая функция-член) |
|
| проверяет, равен ли внутренний счётчик нулю (открытая функция-член) |
|
| блокирует выполнение, пока счётчик не достигнет нуля (открытая функция-член) |
|
| уменьшает счётчик и блокирует выполнение, пока он не достигнет нуля (открытая функция-член) |
|
Константы |
|
|
[статическая] | максимальное значение счётчика, поддерживаемое реализацией (открытая статическая функция-член) |
Примечания
| Макрос проверки поддержки функции | Значение | Стандарт | Функция |
|---|---|---|---|
__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) | многоразовый барьер потоков (шаблон класса) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/thread/latch