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 Bennaniint 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 Bennaniint foo(int i) { return bar(i); } 12*4c2fb2e5SMed Ismail Bennani call_and_wait(int & n)13*4c2fb2e5SMed Ismail Bennanivoid 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 Bennanivoid compute_pow(int &n) { n = foo(n); } 21*4c2fb2e5SMed Ismail Bennani main()22*4c2fb2e5SMed Ismail Bennaniint 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