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