2013-10-27 33 views
1

我有一個簡單的「培訓」項目,必須在Windows中顯示優先級機制。Windows 7中的進程和線程優先級

這是我的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 

爲什麼優先級沒有工作,專櫃有這樣奇怪的值(未排序升序)?

+0

線程優先級只是一個提示,這個程序可以真正輸出任何東西(特別是如果你使用睡眠)。 – user2802841

+0

@ user2802841,我問的是計數器的值,而不是每個優先級的提示值。當程序中的線程優先級類似時,計數器的值必須是「升序排列」 –

+0

@ alena-fox-spb這正是我所說的,在你的程序中,當前編寫的程序不能保證你的計數器值會更低對於優先級較低的線程(或「按升序排序」)。特別是因爲你使用了'Sleep'這個文檔說:_「注意現成的線程不能保證立即運行,因此,直到睡眠間隔過去一段時間之後線程纔可能運行。」_這兩個都會導致你的計數器值是任何東西,最低優先級的線程也可以擁有最高的計數器值。 – user2802841

回答

1

怎麼說@Zilog在這個問題的答案 - 一些奇怪的行動的原因是在MULTI-procces CPU。

如果有人想看看具有不同優先級的線程是如何工作的 - 他們必須使用特定的utulity(如monitor \ profilier of system working),或者在程序中使用特殊的func-s,只使用一個處理器。