Обычно сон будет продолжаться, по крайней мере, до следующего системного прерывания. Тем не менее, это
зависит от настроек ресурсов мультимедийного таймера. Может быть установлено что-то близкое к
1 мс, некоторое оборудование даже позволяет работать с периодами прерывания 0,9765625 ( ActualResolution , предоставленный NtQueryTimerResolution
, покажет 0,9766, но на самом деле это неправильно. Они просто не могут ввести правильное число в ActualResolution (0,9765625мс при 1024 прерываниях в секунду).
Есть одно исключение, которое позволяет нам избежать того факта, что может быть невозможно спать меньше, чем период прерывания: это знаменитый Sleep(0)
. Это очень мощный
инструмент, и он не используется так часто, как следовало бы! Отказывается от напоминания о временном интервале потока. Таким образом, поток остановится, пока планировщик не заставит поток снова получить службу процессора. Sleep(0)
- асинхронная служба, вызов заставит планировщик реагировать независимо от прерывания.
Второй способ - использование waitable object
. Функция ожидания, такая как WaitForSingleObject()
, может ожидать события. Для того, чтобы поток спал какое-то время, в том числе в микросекундном режиме, поток должен установить какой-либо служебный поток, который будет генерировать событие с желаемой задержкой. «Спящий» поток настроит этот поток и затем остановится в функции ожидания, пока служебный поток не установит событие, о котором было сообщено.
Таким образом, любой поток может "спать" или ждать в любое время. Поток обслуживания может быть большой сложности и может предлагать общесистемные услуги, такие как синхронизированные события с микросекундным разрешением. Тем не менее, микросекундное разрешение может привести к тому, что служебный поток будет вращаться в службе времени с высоким разрешением в течение не более одного периода прерывания (~ 1 мс). Если заботиться, это может
работают очень хорошо, особенно на многопроцессорных или многоядерных системах. Вращение много миллисекунд не наносит значительного ущерба в многоядерной системе, когда тщательно обрабатываются маска сходства для вызывающего потока и потока обслуживания.
Код, описание и тестирование можно найти в Windows Timestamp Project