I have a message queue class that has the following API: post( msg ); msg get(); where get( msg ) blocks until there is a message available and post( msg ) notifies when a message is posted. There are four threads waiting in get: MSG mqueue::get(); { MSG msgResult; { boost::mutex::scoped_lock lockQueue( _mutexQueue ); _conditionMessageReady.wait( lockQueue ); if ( _queueOut.size() > 0 ) { msgResult = _queueOut.front(); _queueOut.pop(); } } return msgResult; } The post method USED TO do this: void mqueue::post( MSG msg ) { { boost::mutex::scoped_lock lockQueue( _mutexQueue ); _queueOut.push(msg); } _conditionMessageReady.notify_one(); } When the queue was just a little bit busy (one thread processing, not all four), messages would go into the queue and never come out. I changed the .notify_one() to .notify_all() and I no longer have messages getting stuck in the queue. However, now I have a bunch of threads getting released when there is nothing for them to do (they just loop around and wait again, but YUCK!). Am I missing something or is this "expected" behavior? Thanks again, - Mark P.S. The lockQueue is locked when the condition is done waiting, right?