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;
   }
 }