void ThreadPool::WorkerThread::operator()() { Job *job = NULL; while (true) { { std::unique_lock<std::mutex> lock(pool.queue_mutex); // look for a work item while (!pool.stop && pool.jobs.empty()) { pool.condition.wait(lock); } if (pool.stop && pool.jobs.empty()) // exit if the pool is stopped and we have no more jobs { return; } job = pool.jobs.front(); pool.jobs.pop_front(); } job->Execute(); if (job->GetJobBatch() != NULL) { std::unique_lock<std::mutex> lock(pool.batch_mutex); JobBatch *jobBatch = job->GetJobBatch(); jobBatch->CompletedJob(job); if (jobBatch->GetNumJobs() == 0) { jobBatch->SetCompletedAllJobs(); } } } }