Приоритет процесса и потока в Windows 7

У меня есть простой «обучающий» проект, который должен показать механизм приоритетов в Windows.

Это мой код C ++:

#include <stdio.h>
#include <windows.h>
DWORD WINAPI Thread1(LPVOID);
int stop;
int sleep = 10000;
struct params {
int num;
bool* runflg;
};
long long counters[7] = {0,0,0,0,0,0,0};
int priority[7] = {THREAD_PRIORITY_IDLE,  THREAD_PRIORITY_LOWEST,  THREAD_PRIORITY_BELOW_NORMAL,  THREAD_PRIORITY_NORMAL, THREAD_PRIORITY_ABOVE_NORMAL, THREAD_PRIORITY_HIGHEST, THREAD_PRIORITY_TIME_CRITICAL};
int main(int argc, char* argv[])
{
int thrds;
if (argc < 2) stop = 5;
else stop = atoi(argv[1]);

bool runFlag = true;
__int64 end_time;
LARGE_INTEGER end_time2;

HANDLE tm1 = CreateWaitableTimer(NULL, false, NULL);
end_time = -1 * stop * 10000000;
end_time2.LowPart = (DWORD) (end_time & 0xFFFFFFFF);
end_time2.HighPart = (LONG) (end_time >> 32);
SetWaitableTimer(tm1, &end_time2, 0,NULL, NULL, false);

//SetPriorityClass(GetCurrentProcess(), HIGH_PRIORITY_CLASS);
printf("process priority = %d \n", GetPriorityClass(GetCurrentProcess()));
SetProcessPriorityBoost(GetCurrentProcess(), true);

for (int i = 0; i < 7; i++) {
DWORD targetThreadId;
params* param = (params*)malloc(sizeof(params));
param->num = i;
param->runflg = &runFlag;
HANDLE t1 = CreateThread(NULL, 0, Thread1, param, 0, &targetThreadId);
SetThreadPriority(t1, priority[i]); //задание приоритета

PBOOL ptr1 = (PBOOL)malloc(sizeof(BOOL));
GetThreadPriorityBoost(t1, ptr1);
SetThreadPriorityBoost(t1, true); //запрет динамического изм. приоритета

CloseHandle(t1);
}
WaitForSingleObject(tm1,INFINITE);
runFlag = false;
CloseHandle(tm1);
printf("\n");
for (int i = 0; i < 7; i++) {
printf("%d - %ld\n",i,  counters[i]);
}
return 0;
}
DWORD WINAPI Thread1(LPVOID prm)
{
params arg = *((params*)prm);
printf("thread # %d priority  = %d \n", arg.num, GetThreadPriority(GetCurrentThread()));

while(1) {
counters[arg.num]++;
Sleep(0);
if(*(arg.runflg) == false)
break;
}
return 0;
}

В коде я создаю 7 потоков с разными приоритетами потоков. Каждая нить имеет свой счетчик. Программа должна работать около 5 секунд, и после этого консоль должна показывать приоритеты потоков и их значения.
Когда я делал это год назад на Win XP 32, все работало — поток с меньшим приоритетом имеет меньшее значение счетчика. Но теперь у меня странные результаты, как это:

process priority = 32

thread # 0 priority  = -15
thread # 1 priority  = -2
thread # 2 priority  = -1
thread # 3 priority  = 0
thread # 4 priority  = 1
thread # 5 priority  = 2
thread # 6 priority  = 15

0 - 5401405
1 - 5726804
2 - 6676367
3 - 8320768
4 - 3223481
5 - 3085247
6 - 3177885

Почему уровни приоритета не работают и счетчики имеют такие странные значения (не отсортированы по возрастанию)?

1

Решение

Как сказал @Zilog в ответах на этот вопрос — причина некоторых странных действий лежит в MULTI-procces CPU.

Если кто-то хочет увидеть, как работают потоки с разным приоритетом, — он должен использовать особую волю (например, монитор \ профилировщик системы, работающей в системе), или в программе использовать специальные функции, которые используют только один процессор.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]