XP应用程序不会增加CPU利用率

时间:2011-07-15 12:27:13

标签: c++

我正在尝试修复遗留的Visual Studio win32 un-managed c ++应用程序的问题,该应用程序无法跟上输入。作为我的解决方案的一部分,我正在探索提升课程和线程优先级。

我的电脑有4个xeon处理器,运行64位XP。我写了一个简短的win32测试应用程序,它创建了4个后台循环线程,每个线程在自己的处理器上运行。一些代码示例如下所示。问题是,即使我将优先级提高到极限,cpu利用率仍然低于1%。

我的测试应用是32位,在WOW64上运行。同样的测试应用程序在32位xp机器上也利用不到1%的CPU利用率。我是这两台机器的管理员。我还需要做些什么才能让它发挥作用?

DWORD __stdcall ThreadProc4 (LPVOID)
{
    SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_TIME_CRITICAL);
    while (true)
    {
        for (int i = 0; i < 1000; i++)
        {
            int p = i;
            int red = p *5;
            theClassPrior4 = GetPriorityClass(theProcessHandle);
        }
        Sleep(1);
    }
}

int APIENTRY _tWinMain(...)
{
...
    theProcessHandle = GetCurrentProcess();
    BOOL theAffinity = GetProcessAffinityMask(
        theProcessHandle,&theProcessMask,&theSystemMask);

    SetPriorityClass(theProcessHandle,REALTIME_PRIORITY_CLASS);

    DWORD  threadid4 = 0;
    HANDLE thread4   = CreateThread((LPSECURITY_ATTRIBUTES)NULL,
        0,
        (LPTHREAD_START_ROUTINE)ThreadProc4,
        NULL,
        0,
        &threadid4);

    DWORD_PTR theAff4 = 8;
    DWORD_PTR theAf4 = SetThreadAffinityMask(thread1,theAff4);
    SetThreadPriority(thread4,THREAD_PRIORITY_TIME_CRITICAL);
    ResumeThread(thread4);

1 个答案:

答案 0 :(得分:4)

好吧,如果你想让它实际占用CPU时间,你会想要删除那个'睡眠'电话 - 你的'处理'没有花费大量的时间,所以它花了大部分时间睡觉。

您还需要查看优化器对您的代码执行的操作。如果它在你的循环中完全删除了'p'和'red'(和乘法)(因为结果从未使用过),我不会感到完全惊讶。你可以尝试将'red'标记为volatile,这会强制它不能删除计算。