void thread(size_t cpuid) { while(1) { std::pair<size_t, bool> job = queue.try_dequeue(); if (job.second == false) { bool ret = try_terminate(cpuid, job); if (ret == true) break; if (ret == false && job.second == false) continue; } task(job.first); } }
bool try_terminate(size_t cpuid, std::pair<size_t, bool> &job) { job.second = false; numactive.dec(); cons.begin_done_critical_section(cpuid); job = queue.try_dequeue(); if (job.second == false) { bool ret = cons.end_done_critical_section(cpuid); numactive.inc(); return ret; } else { cons.cancel_critical_section(cpuid); numactive.inc(); return false; } }