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