Win32: атомарное выполнение блока кода - PullRequest
1 голос
/ 14 ноября 2008

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

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

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

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

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

Ответы [ 4 ]

2 голосов
/ 14 ноября 2008

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

2 голосов
/ 14 ноября 2008

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

Разве нельзя было бы просто настроить процент выше 100?

perc = ( perc > 100.0f ) ? 100.0f : perc;
1 голос
/ 14 ноября 2008

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

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

1 голос
/ 14 ноября 2008

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

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