|  | #include "pseudo_barrier.h" | 
|  | #include <condition_variable> | 
|  | #include <mutex> | 
|  | #include <thread> | 
|  | #include <vector> | 
|  |  | 
|  | 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<std::mutex> lock(mutex); | 
|  | cond.notify_all(); // Set thread3 break point on notify_all at this line. | 
|  | return NULL; | 
|  | } | 
|  |  | 
|  | void * | 
|  | thread2(void *input) | 
|  | { | 
|  | std::unique_lock<std::mutex> 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<std::mutex> lock(mutex); | 
|  |  | 
|  | std::thread thread_1(thread1, nullptr); | 
|  | cond.wait(lock); // wait for thread2 | 
|  |  | 
|  | pseudo_barrier_init(thread3_barrier, 10); | 
|  |  | 
|  | std::vector<std::thread> 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; | 
|  | } |