Здравствуйте.
Столкнулся с тем, что при отключённом динамическом повышении приоритетов Windows всё равно его повышает. Пример кода:
#include <cstddef>
#include <cassert>
#include <tchar.h>
#include <windows.h>
DWORD WINAPI thread_proc(LPVOID parameter)
{
OutputDebugString(_T("thread_proc begin\n"));
for (;;)
;
OutputDebugString(_T("thread_proc end\n"));
}
void create_thread()
{
OutputDebugString(_T("create_thread begin\n"));
HANDLE thread_handle = CreateThread(NULL, 0,
thread_proc, 0, CREATE_SUSPENDED, NULL);
assert(thread_handle != NULL);
SetThreadPriority(thread_handle, THREAD_PRIORITY_ABOVE_NORMAL);
ResumeThread(thread_handle);
OutputDebugString(_T("create_thread end\n"));
}
int main()
{
// Убираем динамическое повышение приоритетов для потоков процесса
SetProcessPriorityBoost(GetCurrentProcess(), TRUE);
// Разрешаем исполнять потоки процесса только на одном процессоре
SetProcessAffinityMask(GetCurrentProcess(), 1);
// Применяем настройки
Sleep(0);
create_thread();
return 0;
}
Программа выводит:
create_thread begin
thread_proc begin
create_thread end
и нормально завершается.
Spy++ показывает следующие приоритеты нитей:
Строка create_thread();
Основная нить:
текущий 8
базовый 8
Дополнительная нить:
ещё нет
Строка return 0;
Основная нить:
текущий 15
базовый 8
Дополнительная нить:
текущий 9
базовый 9
С чем может быть связано такое поведение, что-то не так вызвал?
Для размышления открывок из "М. Руссинович, Д. Соломон. Внутреннее устройство Microsoft Windows":
Всякий раз, когда поток в активном процессе завершает ожидание объекта ядра, функция KiUnwaitThread динамически повышает его текущий (не базовый) приоритет на величину текущего значения PsPrioritySeparation. (Какой процесс является активным, определяет подсистема управления окнами.) Как было сказано в разеде "Управление величиной кванта" ранее в этой главе, PsPrioritySeparation представляет собой индекс в таблице квантов (байтовом массиве), с помощью которой выбираются величины квантов для потоков активных процессов. Однако в данном случае PsPrioritySeparation используется как значение на которое повышается приоритет.
Это увеличивает отзывчивость интерактивного приложения по окончании ожидания. В результате повышаются шансы на немедленное возобновление его потока — особенно если в фоновом режиме выполняется несколько процессов с тем же базовым приоритетом.
В отличие от других видов динамического повышения приоритета этот поддерживается всеми системами Windows, и его нельзя отключить даже через Windows-функцию SetThreadPriorityBoost.