| #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; |
| } |