1*99451b44SJordan Rupprecht #include "pseudo_barrier.h" 2*99451b44SJordan Rupprecht #include <condition_variable> 3*99451b44SJordan Rupprecht #include <mutex> 4*99451b44SJordan Rupprecht #include <thread> 5*99451b44SJordan Rupprecht #include <vector> 6*99451b44SJordan Rupprecht 7*99451b44SJordan Rupprecht std::mutex mutex; 8*99451b44SJordan Rupprecht std::condition_variable cond; 9*99451b44SJordan Rupprecht pseudo_barrier_t thread3_barrier; 10*99451b44SJordan Rupprecht 11*99451b44SJordan Rupprecht void * thread3(void * input)12*99451b44SJordan Rupprechtthread3(void *input) 13*99451b44SJordan Rupprecht { 14*99451b44SJordan Rupprecht pseudo_barrier_wait(thread3_barrier); 15*99451b44SJordan Rupprecht 16*99451b44SJordan Rupprecht int dummy = 47; // thread3-before-lock 17*99451b44SJordan Rupprecht 18*99451b44SJordan Rupprecht std::unique_lock<std::mutex> lock(mutex); 19*99451b44SJordan Rupprecht cond.notify_all(); // Set thread3 break point on notify_all at this line. 20*99451b44SJordan Rupprecht return NULL; 21*99451b44SJordan Rupprecht } 22*99451b44SJordan Rupprecht 23*99451b44SJordan Rupprecht void * thread2(void * input)24*99451b44SJordan Rupprechtthread2(void *input) 25*99451b44SJordan Rupprecht { 26*99451b44SJordan Rupprecht std::unique_lock<std::mutex> lock(mutex); 27*99451b44SJordan Rupprecht cond.notify_all(); // release main thread 28*99451b44SJordan Rupprecht cond.wait(lock); 29*99451b44SJordan Rupprecht return NULL; 30*99451b44SJordan Rupprecht } 31*99451b44SJordan Rupprecht 32*99451b44SJordan Rupprecht void * thread1(void * input)33*99451b44SJordan Rupprechtthread1(void *input) 34*99451b44SJordan Rupprecht { 35*99451b44SJordan Rupprecht std::thread thread_2(thread2, nullptr); 36*99451b44SJordan Rupprecht thread_2.join(); 37*99451b44SJordan Rupprecht 38*99451b44SJordan Rupprecht return NULL; 39*99451b44SJordan Rupprecht } 40*99451b44SJordan Rupprecht main()41*99451b44SJordan Rupprechtint main() 42*99451b44SJordan Rupprecht { 43*99451b44SJordan Rupprecht std::unique_lock<std::mutex> lock(mutex); 44*99451b44SJordan Rupprecht 45*99451b44SJordan Rupprecht std::thread thread_1(thread1, nullptr); 46*99451b44SJordan Rupprecht cond.wait(lock); // wait for thread2 47*99451b44SJordan Rupprecht 48*99451b44SJordan Rupprecht pseudo_barrier_init(thread3_barrier, 10); 49*99451b44SJordan Rupprecht 50*99451b44SJordan Rupprecht std::vector<std::thread> thread_3s; 51*99451b44SJordan Rupprecht for (int i = 0; i < 10; i++) { 52*99451b44SJordan Rupprecht thread_3s.push_back(std::thread(thread3, nullptr)); 53*99451b44SJordan Rupprecht } 54*99451b44SJordan Rupprecht 55*99451b44SJordan Rupprecht cond.wait(lock); // wait for thread_3s 56*99451b44SJordan Rupprecht 57*99451b44SJordan Rupprecht lock.unlock(); 58*99451b44SJordan Rupprecht 59*99451b44SJordan Rupprecht thread_1.join(); 60*99451b44SJordan Rupprecht for (auto &t : thread_3s){ 61*99451b44SJordan Rupprecht t.join(); 62*99451b44SJordan Rupprecht } 63*99451b44SJordan Rupprecht 64*99451b44SJordan Rupprecht return 0; 65*99451b44SJordan Rupprecht } 66