Вопрос

У меня есть два системных вызова GetSystemTime() и GetThreadTimes(), которые мне нужны для расчета загрузки ЦП данным потоком Win32.

Для точности мне нужно убедиться, что GetSystemTime() и GetThreadTimes() выполняются атомарно;то естьмежду вызовами GetSystemTime() и GetThreadTimes() не должно быть переключения контекста.

Причина в том, что иногда у меня получается процент более 100% (~ 1 из 500).

Как я могу обеспечить атомарное выполнение двух вызовов функций?

Спасибо, Сачин

Это было полезно?

Решение

Лучше всего было бы назначить вычислительному потоку приоритет в реальном времени.Потоки реального времени вытесняются только другими потоками реального времени (или потоками с повышенным приоритетом в реальном времени).

Другие советы

Я не уверен, что ты сможешь.Если только вы не знаете, какие базовые операции выполняются в каждой функции, и поскольку они являются вызовами Windows API...удачи.

Нельзя ли просто сделать поправку на проценты, превышающие 100?

perc = ( perc > 100.0f ) ? 100.0f : perc;

К сожалению, пути нет.Между двумя системными вызовами в Win32 нет способа предотвратить переключение контекста вашего процесса/потока.В противном случае для кого-то было бы тривиально реализовать процесс, который блокирует систему, отказываясь от любого отключения.

Поможет ли вызов функций в обратном порядке?(99% лучше, чем 101%...)

Кроме того, если вы принудительно переключите контекст непосредственно перед этим (например, вызвав Sleep()), вы, вероятно, уменьшите вероятность отключения.Хотя я не знаю, насколько хорошо это сработает.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top