Странное поведение std :: chrono / std :: this_thread :: sleep_for - PullRequest
0 голосов
/ 21 апреля 2020

Я реализовал следующую функцию:

bool ResponsiveSleep(atomic<bool>& flag, const float nSeconds, const float grainSec=0.1f)
{
  auto tpUntil = chrono::steady_clock::now() + chrono::duration<float>(nSeconds);
  while (chrono::steady_clock::now() < tpUntil) {
    if (flag.load(memory_order::acquire)) {
      return true;
    }
    this_thread::sleep_for(chrono::duration<float>(grainSec));
  }
  return flag.load(memory_order::acquire);
}

И я вызываю это так, чтобы спать на 5 секунд:

atomic<bool> flag = false;
cout << "Start sleeping: " << double(clock()) / CLOCKS_PER_SEC << endl;
TimeUtils::ResponsiveSleep(flag, 5);
cout << "Stop sleeping: " << double(clock()) / CLOCKS_PER_SEC << endl;

Однако я получаю случайные сны От 20 до 40 секунд. Система: Windows 10, MSVC ++ 2019 v16.5.3

Не могли бы вы помочь решить эту проблему? Я предполагаю, что chrono::duration<float>(x) на самом деле не ожидает количество секунд, равное x, однако ранее я нашел примеры, предполагающие это.

...