xref: /llvm-project/lldb/test/API/functionalities/thread/num_threads/main.cpp (revision 99451b4453688a94c6014cac233d371ab4cc342d)
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 Rupprecht thread3(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 Rupprecht thread2(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 Rupprecht thread1(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 Rupprecht int 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