我正在尝试修复遗留的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);
答案 0 :(得分:4)
好吧,如果你想让它实际占用CPU时间,你会想要删除那个'睡眠'电话 - 你的'处理'没有花费大量的时间,所以它花了大部分时间睡觉。
您还需要查看优化器对您的代码执行的操作。如果它在你的循环中完全删除了'p'和'red'(和乘法)(因为结果从未使用过),我不会感到完全惊讶。你可以尝试将'red'标记为volatile,这会强制它不能删除计算。