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" 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 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
int main()
{
boost::mutex Mutex;
boost::condition_variable Condition;
bool Quit = false;
boost::thread Thread([&]
{
boost::unique_lockboost::mutex Lock(Mutex);
while (!Quit)
{
Condition.wait(Lock);
}
});
boost::this_thread::sleep_for(boost::chrono::seconds(1));
boost::lock_guardboost::mutex Lock(Mutex);
Quit = true;
Condition.notify_all();
return 0;
}
_______________________________________________
Boost-users mailing list
Boost-users@lists.boost.org
http://lists.boost.org/mailman/listinfo.cgi/boost-users