【问题标题】:Process and thread priority in windows 7Windows 7 中的进程和线程优先级
【发布时间】:2013-11-06 06:58:39
【问题描述】:

我有一个简单的“培训”项目,必须在 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

为什么优先级不起作用,计数器有这么奇怪的值(未按升序排序)?

【问题讨论】:

  • 线程优先级只是一个提示,这个程序真的可以输出任何东西(特别是如果你使用睡眠)。
  • @user2802841,我问的是计数器值,而不是每个优先级的提示值。当线程优先级在这个程序中时,计数器值必须“升序”
  • @alena-fox-spb 这正是我所说的,在您当前编写的程序中,不能保证您的计数器值对于具有较低优先级的线程(或“排序上升”)。特别是因为您使用 Sleep 文档说:“请注意,准备好的线程不能保证立即运行。因此,线程可能要等到睡眠间隔过去一段时间后才会运行。”这些可以使您的计数器值变为任何值,最低优先级的线程也可以具有最高的计数器值。
  • @user2802841,好的,但是如何以另一种方式显示具有不同优先级的线程之间的差异? (没有计数器)你能告诉前任或任何想法吗?)
  • 你是在单核cpu上运行吗?

标签: c++ windows process thread-priority


【解决方案1】:

@Zilog 在回答这个问题时怎么说 - 一些奇怪动作的原因是在 MULTI-procces CPU 中。

如果有人想查看具有不同优先级的线程如何工作 - 他们必须使用特定的实用程序(如系统工作的监视器\分析器),或者在程序中使用特殊的 func-s,它只使用一个处理器。

【讨论】:

    猜你喜欢
    • 2011-06-25
    • 2021-09-15
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-02
    相关资源
    最近更新 更多