Commit 3e5b4084 authored by Sébastien Villemot's avatar Sébastien Villemot

Dynare++: fix bug in new threading code

At the end of a thread, we must first notify the main 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().

Bug introduced in commit 752a02a3.
parent 44a378bf
Pipeline #724 passed with stages
in 1114 minutes and 31 seconds
...@@ -28,7 +28,15 @@ namespace sthread ...@@ -28,7 +28,15 @@ namespace sthread
(*it)->operator()(mut_threads); (*it)->operator()(mut_threads);
std::unique_lock<std::mutex> lk2{mut_cv}; std::unique_lock<std::mutex> lk2{mut_cv};
counter--; 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(); th.detach();
++it; ++it;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment