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