A barrier is a thread coordination mechanism
whose lifetime consists of a sequence of barrier phases,
where each phase allows at most an expected number of threads to block
until the expected number of threads arrive at the barrier.
When the expected count reaches zero, the phase completion step is run.
For the specialization
with the default value of the CompletionFunction template parameter,
the completion step is run
as part of the call to arrive or arrive_and_drop
that caused the expected count to reach zero.
For other specializations,
the completion step is run on one of the threads
that arrived at the barrier during the phase.
When the completion step finishes,
the expected count is reset
to what was specified by the expected argument to the constructor,
possibly adjusted by calls to arrive_and_drop, and
the next phase starts.
Unblocks all threads that are blocked on the phase synchronization point.
The end of the completion step strongly happens before
the returns from all calls that were unblocked by the completion step.
For specializations that do not have
the default value of the CompletionFunction template parameter,
the behavior is undefined if any of the barrier object's member functions
other than wait are called while the completion step is in progress.
The default value of the CompletionFunction template parameter is
an unspecified type, such that,
in addition to satisfying the requirements of CompletionFunction,
it meets the Cpp17DefaultConstructible
requirements (Table 27) and
completion() has no effects.