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