Defined in header <barrier> | ||
---|---|---|
template<class CompletionFunction = /* see below */> class barrier; | (since C++20) |
The class template std::barrier
provides a thread-coordination mechanism that allows at most an expected number of threads to block until the expected number of threads arrive at the barrier. Unlike std::latch
, barriers are reusable: once the arriving threads are unblocked from a barrier phase's synchronization point, the same barrier can be reused.
A barrier object's lifetime consists of a sequence of barrier phases. Each phase defines a phase synchronization point. Threads that arrive at the barrier during the phase can block on the phase synchronization point by calling wait
, and will be unblocked when the phase completion step is run.
A barrier phase consists following steps:
arrive
or arrive_and_drop
. std::barrier<>
(using the default template argument), the completion step is run as part of the call to arrive
or arrive_and_drop
that caused the expected count to reach zero. wait
are called during the completion step. arrive_and_drop
since, and the next barrier phase begins. Concurrent invocations of the member functions of barrier
, except for the destructor, do not introduce data races.
CompletionFunction | - | a function object type |
-CompletionFunction must meet the requirements of MoveConstructible and Destructible. std::is_nothrow_invocable_v<CompletionFunction&> must be true . |
The default template argument of CompletionFunction
is an unspecified function object type that addtionally meets the requirements of DefaultConstructible. Calling an lvalue of it with no arguments has no effects.
Every barrier object behaves as if it holds an exposition-only non-static data member completion_
of type CompletionFunction
and calls it by completion_()
on every phase completion step.
Name | Definition |
---|---|
arrival_token | an unspecified object type meeting requirements of MoveConstructible, MoveAssignable and Destructible |
constructs a barrier (public member function) |
|
destroys the barrier (public member function) |
|
operator=
[deleted] | barrier is not assignable (public member function) |
arrives at barrier and decrements the expected count (public member function) |
|
blocks at the phase synchronization point until its phase completion step is run (public member function) |
|
arrives at barrier and decrements the expected count by one, then blocks until current phase completes (public member function) |
|
decrements both the initial expected count for subsequent phases and the expected count for current phase by one (public member function) |
|
Constants |
|
[static] | the maximum value of expected count supported by the implementation (public static member function) |
Feature-test macro |
---|
__cpp_lib_barrier |
#include <barrier> #include <iostream> #include <string> #include <thread> #include <vector> int main() { const auto workers = { "anil", "busara", "carl" }; auto on_completion = []() noexcept { // locking not needed here static auto phase = "... done\n" "Cleaning up...\n"; std::cout << phase; phase = "... done\n"; }; std::barrier sync_point(std::ssize(workers), on_completion); auto work = [&](std::string name) { std::string product = " " + name + " worked\n"; std::cout << product; // ok, op<< call is atomic sync_point.arrive_and_wait(); product = " " + name + " cleaned\n"; std::cout << product; sync_point.arrive_and_wait(); }; std::cout << "Starting...\n"; std::vector<std::thread> threads; for (auto const& worker : workers) { threads.emplace_back(work, worker); } for (auto& thread : threads) { thread.join(); } }
Possible output:
Starting... anil worked carl worked busara worked ... done Cleaning up... busara cleaned carl cleaned anil cleaned ... done
(C++20) | single-use thread barrier (class) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/thread/barrier