Приостановка до срока теперь гарантированно не заканчивается раньше него
23.01.2026Исправлена семантика приостановки потока до заданного срока: раньше она могла вернуться раньше этого срока.
Почему это происходило
Счётчик, от которого отсчитывается текущий момент, и часы, по которым планируется ожидание, могут быть разными. Например, текущий момент на Windows берётся из счётчика производительности с высоким разрешением, а ожидание планируется через таймер ожидания, считающий от другого источника.
Если источники расходятся — а они расходятся при переходе между режимами энергосбережения, при пересчёте частоты, при выходе из режима сна, — то срок, посчитанный по одному источнику, оказывается уже прошедшим по другому. Ожидание сразу завершается.
Почему это не мелочь
Приостановка до срока — это способ ждать, не расходуя ресурсы процессора. Если она может вернуться раньше, код обязан проверять время в цикле, а это отменяет экономию: процессор снова просыпается постоянно.
Код, который полагается на «поспал до срока, значит срок наступил», верен по смыслу, но не по факту. И такая ошибка проявляется редко — только при переходе энергопотребления.
Оригинал
The clock source used for sleep might not be the same as the one used for Instant, so the implementation of sleep_until may not assume that the Instant has elapsed.
Упоминаний: 1 · Просмотров: 5