66 lines
1.2 KiB
C++
66 lines
1.2 KiB
C++
#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;
|
|
}
|