GetThreadtimes дает странные результаты - PullRequest
1 голос
/ 08 апреля 2011


Я отслеживаю поток, используя GetThreadTimes каждые 5 мкс (более или менее)
Этот поток равен «Sleeping» в течение 1 минуты, но по некоторым причинам иногда «Пользовательское время», которое я получаю из GetThreadTimes, меняется, даже если поток все еще находится в спящем режиме.
Время ядра всегда равно 0.

Кто-нибудь знает, почему это происходит?
спасибо:)

Ответы [ 3 ]

5 голосов
/ 29 апреля 2012

5 микросекунд?!

GetThreadTimes() измеряет количество квантов, потраченных потоком в спящем режиме пользователь / ядро.Я наблюдал типичный квант планировщика 10-15мс на Win32.Ниже одного кванта вы обнаружите, что времена, когда GetThreadTimes() отчеты не изменяются, - это просто умножает (целое) число прошедших квантов (в каждом состоянии) на продолжительность одного кванта.

Ниже 10-15 мсек, вы действительно не можете ожидать, что любое из значений, возвращаемых GetThreadTimes(), будет точным. ОЧЕНЬ часто вы будете видеть только одно из трех измеренных значений, обновляемых одновременно;именно так, как вы обсуждали.

Как Linux, так и Win32 ведут себя странно, сообщая о времени выполнения потоков в масштабах, которые вы обсуждали.Единственные обнаруженные мной операционные системы, которые действительно могут измерять запланированное время выполнения до 5 микросекунд, - это Mac OS X и VxWorks - QNX, вероятно, также имеет такую ​​возможность.

2 голосов
/ 08 апреля 2011

Это не полный ответ, но в любом случае здесь есть как минимум 2 причины:

  1. Существует хорошо известная проблема " Инверсия приоритета потока ", подробности см.Ссылка, но очень полезная техника для решения проблемы - это случайное ускорение потоков.Таким образом, существует вероятность того, что поток получит некоторое время процессора.

  2. Спящий поток может быть реализован как цикл с периодической проверкой условия истечения времени.

0 голосов
/ 08 апреля 2011

Из MSDN: Время создания и завершения потока - это моменты времени, выраженные как количество времени, прошедшее с полуночи 1 января 1601 года в Гринвиче, Англия. Существует несколько функций, которые приложение может использовать для преобразования таких значений в более общие формы; см. Функции времени.

Так что он может показывать время, когда вы вышли из нити.

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