Тайм-аут разрешения WaitForSingleObject - PullRequest
11 голосов
/ 22 мая 2009

Когда я ожидаю событие без сигнала, используя функцию WaitForSingleObject , я обнаруживаю, что в некоторых случаях вызов вернет WAIT_TIMEOUT менее чем за указанный период ожидания. Просто зацикливаясь на вызове с тайм-аутом, установленным на 1000 мс, я видел, что ответ возвращался через 990 мс (работает на WinXP). Я использую QueryPerformanceCounter , чтобы получить измерение времени, не зависящее от системных часов, поэтому я не думаю, что смещение часов может быть ответом.

Такое поведение не представляет для меня никаких практических проблем, но я бы хотел понять это лучше. Похоже, что он может работать примерно с разрешением таймера. Публикует ли Microsoft какие-либо дополнительные сведения о точности этой функции? Стоит ли ожидать большей точности в Vista?

1 Ответ

9 голосов
/ 22 мая 2009

Да, WaitForSingleObject использует разрешение тика таймера, он не использует таймер высокого разрешения, такой как QueryPerformanceCounter.

http://msdn.microsoft.com/en-us/library/ms687069(VS.85).aspx, статья MSDN "Функции ожидания" расширяется следующим образом:

Точность указанного тайм-аута интервал зависит от разрешения системные часы. Системные часы «тикает» с постоянной скоростью. Если интервал ожидания меньше, чем разрешение системных часов, время ожидания может истечь меньше чем указанная продолжительность времени. Если интервал ожидания больше одного тик, но меньше двух, ожидание может быть где-то между одним и двумя тиками, и так далее.

В этой статье также объясняется, как использовать timeBeginPeriod для увеличения разрешения системных часов, но это не рекомендуется.

Я могу придумать несколько причин, почему. Во-первых, более высокое разрешение не требуется почти во всех случаях использования WaitForSingleObject. Использование таймера с высоким разрешением потребовало бы от ядра постоянно опрашивать таймер (это невозможно, так как код ядра не всегда гарантированно выполняется) или часто перепрограммировать его для генерирования прерывания (поскольку может быть несколько WaitForSingleObjects и, скорее всего, только один программируемое прерывание).

С другой стороны, уже есть источник синхронизации, который постоянно обновляется с разрешением, которое более чем достаточно для WaitForSingleObject, SetWaitableTimer и Sleep.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...