#include #include #include #include #include using namespace std; vector already_done; mutex already_done_mutex; uint64_t fib(int x){ if(already_done.size() > x) return already_done[x]; if (x < 2) { return 1; } // lock here already_done_mutex.lock(); if(already_done.size() > x){ // unlock already_done_mutex.unlock(); return already_done[x]; } uint64_t result = fib(x-1) + fib(x-2); already_done.push_back(result); // unlock here already_done_mutex.unlock(); return result; } void calc_and_print(int n){ printf("%d: %lu\n", n, fib(n)); } int main(){ vector threads; already_done.push_back(1); already_done.push_back(1); already_done.push_back(2); for(int i = 1; i < 100; i++){ threads.push_back( thread(calc_and_print, i) ); } /* alternative: for(int i = 0; i < threads.size(); i++) threads[i].join(); */ for(auto &t : threads){ t.join(); printf("Just joined another thread! Another one bites the dust!\n"); } return 0; }