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 Bennani int 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 Bennani int foo(int i) { return bar(i); }
15d3e0f7e1SMed Ismail Bennani 
call_and_wait(int & n)16d3e0f7e1SMed Ismail Bennani void 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 Bennani void compute_pow(int &n) { n = foo(n); }
24d3e0f7e1SMed Ismail Bennani 
main()25d3e0f7e1SMed Ismail Bennani int 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