Boost logo

Boost Users :

From: Vladimir Prus (ghost_at_[hidden])
Date: 2005-08-11 03:33:01

Christian Henning wrote:

> Hi Ben,
> The boost::thread::join() is only for waiting for a thread to
> complete. I don't want to complete the thread when calling stop(). I
> just want to put it into the blocked state.
> I run into a deadlock when I finish the app. I call the stop() and
> then the ~fvAsynchronousSequencer. But usually the thread isn't
> stopped when entering the destructor and when the thread stops after I
> called notify_one() I'm inside a deadlock.

Looks like you've missed what Ben said -- you should never, ever use
condition variable in the way you do:

      boost::mutex::scoped_lock oLock( _oTerminateMutex );
      _oTerminateCond.wait( oLock );

This is asking for troubles -- you can miss "notify_one" if it's executed
before you call "wait", and you get awake when nobody called "notify_one".

Some more details can be found in:

and any book on threading says the same.

> So, is there a way, that when the stop() returns, the worker thread is
> blocked?


   enum Worker_status { running = 1, stopped } status;

   void stop()
        boost::mutex::scoped_lock l(m);
        _bStop = true;
        while(status != stopped)
        _bStop = false;

   void runner()
                // so some work.
                if (_bStop)
                        boost::mutex::scope_lock l(m);
                        status = stopped;

or something like that. I haven't seen your header -- but making _bStop
volatile will not hurt too.

- Volodya

Boost-users list run by williamkempf at, kalb at, bjorn.karlsson at, gregod at, wekempf at