Win32多线程之线程优先级层次

线程的优先级层次(Priority Level)是对进程的优先权类别的一个修改,使你能够调整同一个进程内的各线程的相对重要性。一共有七种优先权等级,如下表所示:

优先级层次调整值
THREAD_PRIORITY_HIGHEST+2
THREAD_PRIORITY_ABOVE_NORMAL+1
THREAD_PRIORITY_NORMAL0
THREAD_PRIORITY_BELOW_NORMAL-1
THREAD_PRIORITY_LOWEST-2
THREAD_PRIORITY_IDLESet to 1
THREAD_PRIORITY_TIME_CRITICALSet to 15

注意:对于 REALTIME_PRIORITY_CLASS的调整值,有点不同于上表所列。

优先级层次可以通过SetThreadPriority()改变之。


BOOL SetThreadPriority(

  HANDLE   hThread,

  int   nPriority

);


参数


hThread       代表欲调整优先权的那个线程。

nPriority        上面表格所显示的数值。



返回值

    如果函数成功,就传回上表格中所列的其中一个值,如果函数失败,就传回FALSE,GetLastError()可以获得更详细的信息。



线程目前的优先权层次可以利用GetThreadPriority()获知。


int  GetThreadPriority(

 HANDLE   hThread

);

参数

 hThread     线程Handle


返回值

如果函数成功,就传回TRUE。如果函数失败,就传回THREAD_PRIORITY_ERROR_RETURN。GetLastError()可以获得更详细的信息。


动态提升(Dynamic Boost)

  决定线程真正优先权的最后一个因素是目前的动态提升值(Dynamic Boost)。所谓动态提升是对优先权的一种调整,使系统能够机动对待线程,以强化程序的可用性。

  当线程获得键盘输入,该线程就得到一个+5的优先权调整值。这使得该线程有机会处理那个输入,并且提供立即的回应给用户,其他可能引起优先权动态提升的情况还包括鼠标消息,计时器消息等等,这种情况使用于同一个进程中的线程。

  当一个线程正在等待一个mutex,当Wait...()返回时,该线程的的优先权会获得动态提升,这样的提升值意味着critical sections将尽可能被快速处理,而等待时间将尽可能地缩短,这种情况适用于任何一个线程(不限于哪一个进程身上)。

 下面使用CreateThread()产生一个新线程,传回其handle,但并不马上开始执行:

HANDLE  hThread;

DWORD  threadId;

hThread  = CreateThread( NULL,

                                                0,

           ThreadFunc,

                0,

   CREATE_SUSPENDED, //线程一开始处于挂起状态

  &threadId);

SetThreadPriority(hThread, THREAD_PRIORITY_IDLE);

一旦线程设定妥当,你可以调用ResumeThread()开始执行:


DWORD  ResumeThread(

  HANDLE  hThread

);

参数


hThread                     欲被再次执行的线程。


返回值

   如果函数返回成功,则传回线程的前一个挂起次数。如果失败,则传回0xFFFFFFFF。GetLastError()可以获得更详细的信息。


挂起一个线程

  相对于ResumeThr(),很容易联想到有一个SuspendThread()函数。这个函数允许调用端指定一个线程睡眠(挂起),直到又有人调用了ResumeThread(),线程才会醒来。因此,睡眠中的线程不可能唤醒自己。这个函数的规格如下:

 DWORD  SuspendThread(

  HANDLE   hThread

);


参数


hThread                欲被挂起的线程。


返回值

            如果函数成功,则传回线程目前的挂起次数。如果失败,则传回0xFFFFFFFF,GetLastError()可以获得更详细的信息。

 SuspendThread()是另一个可能会潜在引发问题的函数。考虑一下这种情况:一个进程拥有三个线程A,B,C,线程C正在某个critical section内,而线程B正在等待它出来。然后,线程挂起了线程C,在这种情况下,线程C将永远不会离开critical section,而线程B也就相当于进入了死锁状态。

   SuspendThread()的最大用途就是用来协助撰写调试器,调试器允许在程序员的控制之下,启动或者停止任何一个线程。


 



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值