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