diff --git a/dynare++/tl/cc/sthread.cc b/dynare++/tl/cc/sthread.cc index 36e21b9f3ac87445dfad2cc1bdd9f8d6abe091fa..751e77f54174ac25e0e4ec88b75f4e1019735d36 100644 --- a/dynare++/tl/cc/sthread.cc +++ b/dynare++/tl/cc/sthread.cc @@ -28,7 +28,15 @@ namespace sthread (*it)->operator()(mut_threads); std::unique_lock<std::mutex> lk2{mut_cv}; counter--; - std::notify_all_at_thread_exit(cv, std::move(lk2)); + /* First notify the thread waiting on the condition variable, then + unlock the mutex. We must do these two operations in that order, + otherwise there is a possibility of having the main process + destroying the condition variable before the thread tries to + notify it (if all other threads terminate at the same time and + bring the counter down to zero). + For that reason, we cannot use std::notify_all_at_thread_exit() */ + cv.notify_one(); + lk2.unlock(); }}; th.detach(); ++it;