void ThreadPool::threadLoop()

in dispenso/thread_pool.cpp [16:43]


void ThreadPool::threadLoop(std::atomic<bool>& running) {
  using namespace std::chrono_literals;

  constexpr auto kSleepDuration = std::chrono::microseconds(DISPENSO_POLL_PERIOD_US);
  constexpr int kBackoffYield = 50;
  constexpr int kBackoffSleep = kBackoffYield + 5;
  OnceFunction next;

  int failCount = 0;

  detail::PerPoolPerThreadInfo::registerPool(this);

  moodycamel::ConsumerToken token(work_);
  while (running.load(std::memory_order_relaxed) ||
         workRemaining_.load(std::memory_order_relaxed)) {
    while (work_.try_dequeue(token, next)) {
      executeNext(std::move(next));
      failCount = 0;
    }
    ++failCount;
    detail::cpuRelax();
    if (failCount > kBackoffSleep) {
      std::this_thread::sleep_for(kSleepDuration);
    } else if (failCount > kBackoffYield) {
      std::this_thread::yield();
    }
  }
}