本次出现了一些奇怪的问题。。。导致最后结果跟预期的不一样。。
110,我要报警
内容:
线程的优先级
线程是分级的!
有以下几种优先级
THREAD_PRIORITY_TIME_CRITICAL:Time-critical 关键时间
THREAD_PRIORITY_HIGHEST:Highest 最高
THREAD_PRIORITY_ABOVE_NORMAL:Above normal 高于标准
THREAD_PRIORITY_NORMAL:Normal 标准
THREAD_PRIORITY_BELOW_NORMAL:Below normal 低于标准
THREAD_PRIORITY_LOWEST:Lowest 最低
THREAD_PRIORITY_IDLE:Idle 空闲
在线程挂起时可以改变其优先级
我们想要创建一个高优先级进程时,create时把那个是否运行设置为 CREATE_SUSPENDED 即可在创建完毕之后挂起它
使用SetThreadPriority函数来改变优先级:两个参数 句柄 优先级
于是我打算试一试那个TIME_CRITICAL和IDLE究竟差多少
搞了两个函数,一个输出233,一个输出666 都输出10次 233函数是TIME_CRITICAL 666函数是IDLE
我以为结果会是前面一片233,最后有几个666。。然而最后结果是这样的
妈的什么鬼?
猜想了一下,可能是因为I/O流的问题。。。
必须得祭出time.h大法啦!
time.h里面有一个clock()函数,返回当前进程启动的时间
于是我搞了个二维数组用来存时间
两个函数边Sleep边获取clock()
当我以为计划通的时候。。。
这是运行结果:
再一次蒙B
这什么鬼。。。明明都是同时运行的!
我要报警了。
上中国某CS*N论坛查了一下。。似乎是系统会自己调优先级
用SetThreadPriorityBoost这个玩意似乎可以禁止系统调优先级
然后不管用。。。
于是又去某论坛查了下,似乎是CPU的锅。
不管啦。。
就这样了。。总之没有达到预期的结果
不过据说这个优先级还是很管用的。。。
不管用的代码:
#include<windows.h> #include<iostream> #include<cstdio> #include<ctime> using namespace std; clock_t t[2][15]; DWORD WINAPI th1(LPVOID lpParam) { for(int i=1;i<=10;i++)Sleep(200),t[0][i]=clock(); return 0; } DWORD WINAPI th2(LPVOID lpParam) { for(int i=1;i<=10;i++)Sleep(200),t[1][i]=clock(); return 0; } HANDLE h[5]; DWORD temp; int main() { t[0][1]=clock(); h[0]=::CreateThread(NULL,NULL,th1,NULL,CREATE_SUSPENDED,&temp); SetThreadPriority(h[0],THREAD_PRIORITY_TIME_CRITICAL); h[1]=::CreateThread(NULL,NULL,th2,NULL,CREATE_SUSPENDED,&temp); SetThreadPriority(h[1],THREAD_PRIORITY_IDLE); SetThreadPriorityBoost(h[0],0); SetThreadPriorityBoost(h[1],0); ::ResumeThread(h[1]),::ResumeThread(h[0]); ::WaitForMultipleObjects(2,h,1,INFINITE); for(int i=1;i>=0;i--)::CloseHandle(h[i]); for(int i=1;i<=10;i++)cout<<"第"<<i<<"次结果:"<<t[0][i]<<" "<<t[1][i]<<endl; return 0; }
不错,不错,看看了!
报警报警,你的图床宕了
博客多久更新一次?
我又来了,您高兴吗?!
看看!