what if notify() is called before wait()?
boost, c++, condition-variable, ns-3, synchronization
Solution
Condition variables can hardly be used alone, if only because, as you noticed, they only wake the currently waiting threads. There's also the matter of spurious wake-ups (ie. the condition variable can sometimes wake up a thread without any corresponding `notify` having been called). To work properly, condition variables usually need another variable to maintain a more reliable state.
To solve both those problems, in your case you just need to add a boolean flag:
boost::unique_lock<boost::mutex> lock(m_pause_mutex);
while (!someFlag)
m_cond_cnn.wait(lock);
someFlag = false;
//...
boost::unique_lock<boost::mutex> lock(m_pause_mutex);
someFlag = true;
m_cond_cnn.notify_one();
Problem
I have a situation where a notify() 'can' be called before a wait(). I am trying to make a simulator to schedule its next event when I 'notify' him by sending him messages. So I have devised a wait->notify->scedule chain ``` void Broker::pause() { boost::unique_lock<boost::mutex> lock(m_pause_mutex); { std::cout << "pausing the simulation" << std::endl; m_cond_cnn.wait(lock); std::cout << "Simulation UNpaused" << std::endl; // the following line causes the current function to be called at // a later time, and a notify() can happen before the current function // is called again Simulator::Schedule(MilliSeconds(xxx), &Broker::pause, this); } } void Broker::messageReceiveCallback(std::string message) { boost::unique_lock<boost::mutex> lock(m_pause_mutex); { m_cond_cnn.notify_one(); } } ``` the problem here is that: there can be situations that a notify() is called before its wait() is called. Is there a solution for such situation? thank you