[diff.cpp20.thread] # Annex C (informative) Compatibility [[diff]](./#diff) ## C.2 C++ and ISO C++ 2020 [[diff.cpp20]](diff.cpp20#thread) ### C.2.13 [[thread]](thread "32 Concurrency support library"): concurrency support library [diff.cpp20.thread] [1](#1) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/compatibility.tex#L797) **Affected subclause:** [[thread.barrier]](thread.barrier) **Change:** In this revision of C++, it is implementation-defined whether a barrier's phase completion step runs if no thread calls wait[.](#1.sentence-1) Previously the phase completion step was guaranteed to run on the last thread that calls arrive or arrive_and_drop during the phase[.](#1.sentence-2) In this revision of C++, it can run on any of the threads that arrived or waited at the barrier during the phase[.](#1.sentence-3) **Rationale:** Correct contradictory wording and improve implementation flexibility for performance[.](#1.sentence-4) **Effect on original feature:** Valid C++ 2020 code using a barrier might have different semantics in this revision of C++ if it depends on a completion function's side effects occurring exactly once, on a specific thread running the phase completion step, or on a completion function's side effects occurring without wait having been called[.](#1.sentence-5) [*Example [1](#example-1)*: auto b0 = std::barrier(1); b0.arrive(); b0.arrive(); // implementation-defined; previously well-definedint data = 0;auto b1 = std::barrier(1, [&] { data++; }); b1.arrive(); assert(data == 1); // implementation-defined; previously well-defined b1.arrive(); // implementation-defined; previously well-defined — *end example*]