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