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