std:: latch
From cppreference.net
C++
Concurrency support library
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
std::latch
| Member functions | ||||
| Constants | ||||
|
Определено в заголовке
<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)
|
многоразовый барьер потоков
(шаблон класса) |