|
Boost Users : |
Subject: [Boost-users] condition_variable
From: Alessandro Bellina (abellina_at_[hidden])
Date: 2009-12-09 08:50:06
Hello,
I am using boost condition_variables to block while waiting for an
asynchronous response. I am seeing an error that happens at random whenever
I am releasing the lock just before calling notify_one. The error goes away
if I keep the lock and release after notify_one.
Here is the code:
class BlockingRequest{
public:
// predicate class
class ResponseStatus
{
public:
ResponseStatus( bool& received ) : m_received( received )
{
}
bool operator()() const
{
return m_received;
}
private:
bool& m_received;
};
//blocking request
std::string Request( const std::string& request )
{
boost::mutex::scoped_lock lock( mutex );
//perform asynchronous request through network or something else, pass
RequestHandler as a handler
boost::posix_time::milliseconds timeoutDuration( 10000 ); //wait for 10
seconds
if( !condition.timed_wait( lock, timeoutDuration, ResponseStatus(
received ) ) )
{
throw std::exception( "Request timed out" );
}
return receivedMessage;
}
//some other thread calls this function
void RequestHandler( const std::string& message, void* caller )
{
BlockingRequest* myRequest = reinterpret_cast< BlockingRequest* >(
caller );
boost::mutex::scoped_lock lock( myRequest->mutex );
myRequest->receivedMessage = message;
myRequest->received = true;
/*
if this next line in bold is commented out, code works fine...
contrary to Boost documentation.
http://www.boost.org/doc/libs/1_41_0/doc/html/thread/synchronization.html#thread.synchronization.condvar_ref
*/
*lock.unlock();*
myRequest->condition.notify_one();
}
};
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