1d3e0f7e1SMed Ismail Bennani #include <thread> 2d3e0f7e1SMed Ismail Bennani 3*8f549c53SMed Ismail Bennani #include "baz.h" 4*8f549c53SMed Ismail Bennani 5*8f549c53SMed Ismail Bennani std::condition_variable cv; 6*8f549c53SMed Ismail Bennani std::mutex mutex; 7680ca7f2SMed Ismail Bennani bar(int i)8d3e0f7e1SMed Ismail Bennaniint bar(int i) { 9d3e0f7e1SMed Ismail Bennani int j = i * i; 10680ca7f2SMed Ismail Bennani return j; 11d3e0f7e1SMed Ismail Bennani } 12d3e0f7e1SMed Ismail Bennani foo(int i)13d3e0f7e1SMed Ismail Bennaniint foo(int i) { return bar(i); } 14d3e0f7e1SMed Ismail Bennani compute_pow(int & n)15*8f549c53SMed Ismail Bennanivoid compute_pow(int &n) { 16*8f549c53SMed Ismail Bennani std::unique_lock<std::mutex> lock(mutex); 17*8f549c53SMed Ismail Bennani n = foo(n); 18*8f549c53SMed Ismail Bennani lock.unlock(); 19*8f549c53SMed Ismail Bennani cv.notify_one(); // waiting thread is notified with n == 42 * 42, cv.wait 20*8f549c53SMed Ismail Bennani // returns 21d3e0f7e1SMed Ismail Bennani } 22d3e0f7e1SMed Ismail Bennani call_and_wait(int & n)23*8f549c53SMed Ismail Bennanivoid call_and_wait(int &n) { baz(n, mutex, cv); } 24d3e0f7e1SMed Ismail Bennani main()25d3e0f7e1SMed Ismail Bennaniint main() { 26d3e0f7e1SMed Ismail Bennani int n = 42; 27d3e0f7e1SMed Ismail Bennani std::thread thread_1(call_and_wait, std::ref(n)); 28d3e0f7e1SMed Ismail Bennani std::thread thread_2(compute_pow, std::ref(n)); 29d3e0f7e1SMed Ismail Bennani 30d3e0f7e1SMed Ismail Bennani thread_1.join(); 31d3e0f7e1SMed Ismail Bennani thread_2.join(); 32d3e0f7e1SMed Ismail Bennani 33d3e0f7e1SMed Ismail Bennani return 0; 34d3e0f7e1SMed Ismail Bennani } 35