|
Boost Users : |
Subject: Re: [Boost-users] Race in boost::condition_variable::wait
From: Ãric Malenfant (eric.malenfant_at_[hidden])
Date: 2015-12-23 10:44:19
Not sure I understand your question.
Unless I'm missing something, the guard in condition_variable::wait does
not release the mutex, it is simply there to ensure that it is reacquired
on exit. The mutex is released by pthread_cond_wait (atomically with the
wait on the condition).
Ãric Malenfant
Le 2015-12-22 8:30 PM, "Chris Stankevitz" <chrisstankevitz_at_[hidden]> a
écrit :
Hi,
Regarding boost::condition_variable::wait (listed below with an
obvious modification), It seems to me that there is a race condition
because the following operations are not atomic: 1) unlocking of "m"
2) waiting on "cond".
Can someone explain to me why boost::condition_variable::wait is not
racing the user code in the example below?
Thank you,
Chris
===
inline void condition_variable::wait(unique_lock<mutex>& m)
{
int res=0;
{
thread_cv_detail::lock_on_exit<unique_lock<mutex> > guard;
detail::interruption_checker
check_for_interruption(&internal_mutex,&cond);
guard.activate(m);
#ifdef ENCOURAGE_DEADLOCK
boost::this_thread::sleep_for(boost::chrono::seconds(100));
#endif
do {
res = pthread_cond_wait(&cond,&internal_mutex);
} while (res == EINTR);
}
}
===
#define ENCOURAGE_DEADLOCK
#include <boost/thread.hpp>
int main()
{
boost::mutex Mutex;
boost::condition_variable Condition;
bool Quit = false;
boost::thread Thread([&]
{
boost::unique_lock<boost::mutex> Lock(Mutex);
while (!Quit)
{
Condition.wait(Lock);
}
});
boost::this_thread::sleep_for(boost::chrono::seconds(1));
boost::lock_guard<boost::mutex> Lock(Mutex);
Quit = true;
Condition.notify_all();
return 0;
}
_______________________________________________
Boost-users mailing list
Boost-users_at_[hidden]
http://lists.boost.org/mailman/listinfo.cgi/boost-users
Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net