我有一个简单的“培训”项目,必须在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}; 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,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,Thread1,param,&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 - %ldn",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)?
sched_setscheduler是针对所有线程还是主线程?
Windows Server 2008 R2(Windows 7)上的命令提示符窗口优先级
如何在实时Linux中select线程/进程优先级?
使用Linux线程优先级和调度策略的指南?
SCHED_FIFO线程在Linux中被SCHED_OTHER线程抢占
单独的线程优先检查使用命令行在Linux中
SCHED_FIFO和SCHED_RR如何相互干扰?
C linux pthread线程优先
进程优先级与线程优先级
有没有办法执行系统命令给予优先?
怎么说@Zilog在这个问题的答案 – 一些奇怪的行动的原因是在MULTI-procces cpu。
如果有人想看看具有不同优先级的线程是如何工作的 – 他们必须使用特定的权限(如系统工作的monitor profilier),或者在程序中使用特殊的函数,只使用一个处理器。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。