В некоторых API потоков возможно пробуждение до завершения сна (например, из-за сигнала, поступающего во время сна). Правильный способ справиться с этим - вычислить абсолютное время пробуждения, а затем выполнить цикл бездействия в течение оставшейся продолжительности. Я бы вообразил, что спать с интервалом в одну секунду было бы хаком, чтобы плохо это приблизить.
Тем не менее, API-интерфейсы Boost Threading this_thread::sleep()
не документированы, чтобы иметь такие ранние пробуждения, и поэтому этот метод не является необходимым (API-интерфейс Boost Thread выполняет цикл за вас).
Вообще говоря, очень мало случаев, когда использование меньших интервалов сна значительно увеличивает задержку пробуждения; ОС обрабатывает все пробуждения более или менее одинаково. В лучшем случае вы можете поддерживать кеш в тепле и избегать выгрузки страниц, но это затронет только небольшую часть памяти, непосредственно участвующую в цикле сна.
Кроме того, большинство операционных систем имеют дело со временем, используя внутренние целочисленные счетчики; это означает, что большие интервалы не приводят к ошибкам округления (как вы могли бы найти со значениями с плавающей запятой). Однако, если вы используете с плавающей запятой для своих собственных вычислений, это может быть проблемой. Если вы в настоящее время используете интервалы с плавающей запятой (скажем, double
секунд с 1970 года), вы можете рассмотреть целочисленные единицы (скажем, long long
миллисекунд с 1970 года).