Приостановка до срока теперь гарантированно не заканчивается раньше него

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