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@gmail.com> 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@lists.boost.org
http://lists.boost.org/mailman/listinfo.cgi/boost-users