@ -73,30 +73,10 @@ private:
std : : deque < std : : unique_ptr < WorkItem > > queue ;
std : : deque < std : : unique_ptr < WorkItem > > queue ;
bool running ;
bool running ;
size_t maxDepth ;
size_t maxDepth ;
int numThreads ;
/** RAII object to keep track of number of running worker threads */
class ThreadCounter
{
public :
WorkQueue & wq ;
explicit ThreadCounter ( WorkQueue & w ) : wq ( w )
{
std : : lock_guard < std : : mutex > lock ( wq . cs ) ;
wq . numThreads + = 1 ;
}
~ ThreadCounter ( )
{
std : : lock_guard < std : : mutex > lock ( wq . cs ) ;
wq . numThreads - = 1 ;
wq . cond . notify_all ( ) ;
}
} ;
public :
public :
explicit WorkQueue ( size_t _maxDepth ) : running ( true ) ,
explicit WorkQueue ( size_t _maxDepth ) : running ( true ) ,
maxDepth ( _maxDepth ) ,
maxDepth ( _maxDepth )
numThreads ( 0 )
{
{
}
}
/** Precondition: worker threads have all stopped (they have been joined).
/** Precondition: worker threads have all stopped (they have been joined).
@ -118,7 +98,6 @@ public:
/** Thread function */
/** Thread function */
void Run ( )
void Run ( )
{
{
ThreadCounter count ( * this ) ;
while ( true ) {
while ( true ) {
std : : unique_ptr < WorkItem > i ;
std : : unique_ptr < WorkItem > i ;
{
{