1*d3e0f7e1SMed Ismail Bennani #include <iostream>
2*d3e0f7e1SMed Ismail Bennani #include <mutex>
3*d3e0f7e1SMed Ismail Bennani #include <thread>
4*d3e0f7e1SMed Ismail Bennani 
5*d3e0f7e1SMed Ismail Bennani int bar(int i) {
6*d3e0f7e1SMed Ismail Bennani   int j = i * i;
7*d3e0f7e1SMed Ismail Bennani   return j; // break here
8*d3e0f7e1SMed Ismail Bennani }
9*d3e0f7e1SMed Ismail Bennani 
10*d3e0f7e1SMed Ismail Bennani int foo(int i) { return bar(i); }
11*d3e0f7e1SMed Ismail Bennani 
12*d3e0f7e1SMed Ismail Bennani void call_and_wait(int &n) {
13*d3e0f7e1SMed Ismail Bennani   std::cout << "waiting for computation!" << std::endl;
14*d3e0f7e1SMed Ismail Bennani   while (n != 42 * 42)
15*d3e0f7e1SMed Ismail Bennani     ;
16*d3e0f7e1SMed Ismail Bennani   std::cout << "finished computation!" << std::endl;
17*d3e0f7e1SMed Ismail Bennani }
18*d3e0f7e1SMed Ismail Bennani 
19*d3e0f7e1SMed Ismail Bennani void compute_pow(int &n) { n = foo(n); }
20*d3e0f7e1SMed Ismail Bennani 
21*d3e0f7e1SMed Ismail Bennani int main() {
22*d3e0f7e1SMed Ismail Bennani   int n = 42;
23*d3e0f7e1SMed Ismail Bennani   std::mutex mutex;
24*d3e0f7e1SMed Ismail Bennani   std::unique_lock<std::mutex> lock(mutex);
25*d3e0f7e1SMed Ismail Bennani 
26*d3e0f7e1SMed Ismail Bennani   std::thread thread_1(call_and_wait, std::ref(n));
27*d3e0f7e1SMed Ismail Bennani   std::thread thread_2(compute_pow, std::ref(n));
28*d3e0f7e1SMed Ismail Bennani   lock.unlock();
29*d3e0f7e1SMed Ismail Bennani 
30*d3e0f7e1SMed Ismail Bennani   thread_1.join();
31*d3e0f7e1SMed Ismail Bennani   thread_2.join();
32*d3e0f7e1SMed Ismail Bennani 
33*d3e0f7e1SMed Ismail Bennani   return 0;
34*d3e0f7e1SMed Ismail Bennani }
35