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

source code of lldb/test/API/functionalities/thread/num_threads/main.cpp