Boost logo

Boost Users :

From: Christian Henning (chhenning_at_[hidden])
Date: 2005-08-10 13:06:20


Hi there, seems the attention span for my last question is over. ;-) I
also think that my subject was misleading. My question isn't about
terminating, completing, or canceling a thread. It's about putting a
thread in a blocked state.

Please consider the following code. All functions, except for the
run(), are called by the GUI thread.

The _oThread object is RAII-object ( Resource Allocation is Initialization ).

// Only called by GUI thread
fvAsynchronousSequencer::fvAsynchronousSequencer()
  : _oThread ( )
  , _bTerminateSequencerThread ( false )

  , _bStop( false )
{
  _oThread.create( this, _run );
}

// Only called by GUI thread
fvAsynchronousSequencer::~fvAsynchronousSequencer()
     throw()
{
  _bTerminateSequencerThread = true;

  // wake up the thread, if necessary
  _oRunCondition.notify_one();

  // wait until the thread is terminated
  {
     boost::mutex::scoped_lock oLock( _oTerminateMutex );
     _oTerminateCond.wait( oLock );
  }
}

// Only called by GUI thread
     void
fvAsynchronousSequencer::start()
{
  _bStop = false;

  _oRunCondition.notify_one();
}

// Only called by GUI thread
     void
fvAsynchronousSequencer::stop()
     throw()
{
  _bStop = true;

 // I would like to wait until the _oThread is a in blocked position.
}

     void
fvAsynchronousSequencer::_run()
     throw()
{
  boost::mutex::scoped_lock oLock( _oRunMutex );

  // Wait until someone calls start()
  _oRunCondition.wait( oLock );

  do
  {
    // do something useful

     while( _bStop )
        _oRunCondition.wait( oLock );

  } while( !_bTerminateSequencerThread );

  // now finish destructing the sequencer
  _oTerminateCond.notify_one();
}

So, I will ask again my question. Is there a way that the stop() will
only return when the worker thread in in blocked state? Right now, I
just set _bStop to true and stop() returns. This approach is of course
rife for deadlocks.

Thanks again,
Christian


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