#include #include #include #include #include #include constexpr unsigned kNumThreads = 16; int main() { latch gate(kNumThreads); std::vector threads; threads.reserve(kNumThreads); for (unsigned t = 0; t < kNumThreads; ++t) { threads.emplace_back([&gate, t]() { if (t % 2 == 0) { unsigned sec = t / 2; std::printf("th%02u sleep %us\n", t, sec); std::this_thread::sleep_for(std::chrono::seconds(sec)); } std::printf("th%02u at gate\n", t); gate.arrive_and_wait(); std::printf("th%02u finished\n", t); }); } for (auto& th : threads) { th.join(); } return 0; }