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; } 

在代码中,我创build了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 

为什么优先级不工作,计数器有这样奇怪的值(不按升序sorting)?

怎么说@Zilog在这个问题的答案 – 一些奇怪的行动的原因是在MULTI-procces CPU。

如果有人想看看具有不同优先级的线程是如何工作的 – 他们必须使用特定的权限(如系统工作的monitor \ profilier),或者在程序中使用特殊的函数,只使用一个处理器。