#include "pseudo_barrier.h" #include #include #include #include std::mutex mutex; std::condition_variable cond; pseudo_barrier_t thread3_barrier; void * thread3(void *input) { pseudo_barrier_wait(thread3_barrier); int dummy = 47; // thread3-before-lock std::unique_lock lock(mutex); cond.notify_all(); // Set thread3 break point on notify_all at this line. return NULL; } void * thread2(void *input) { std::unique_lock lock(mutex); cond.notify_all(); // release main thread cond.wait(lock); return NULL; } void * thread1(void *input) { std::thread thread_2(thread2, nullptr); thread_2.join(); return NULL; } int main() { std::unique_lock lock(mutex); std::thread thread_1(thread1, nullptr); cond.wait(lock); // wait for thread2 pseudo_barrier_init(thread3_barrier, 10); std::vector thread_3s; for (int i = 0; i < 10; i++) { thread_3s.push_back(std::thread(thread3, nullptr)); } cond.wait(lock); // wait for thread_3s lock.unlock(); thread_1.join(); for (auto &t : thread_3s){ t.join(); } return 0; }