Windows核心编程学习笔记(11)--线程调度

来源:互联网 发布:centos如何修改ip地址 编辑:程序博客网 时间:2024/05/12 22:26

Drecik学习经验分享

转载请注明出处:http://blog.csdn.net/drecik__/article/details/8091304

 

  • 线程的挂起与恢复

在线程对象中有一个值表示线程的挂起计数,在调用CreateProcess或CreateThread时,系统将创建线程的内核对象,并把挂起计数初始化为1,因为线程初始化需要时间,这样可以防止线程在初始化的时候被执行。

在线程初始化之后,CreateProcess或CreateThread函数会查看是否传递CREATE_SUSPENDED标志,如果没有则将挂起计数递减为0,让线程可以执行,否则让线程继续保持挂起。

线程可以执行ResumeThread函数来递减挂起计数或者使用SuspendThread函数来递增挂起计数,但是挂起计数不能超过MAXINMUN_SUSPEND_COUNT(127)个,这两个函数原型如下,函数返回值都是调用函数之前的挂起计数

DWORD ResumeThread(HANDLE hThread// 线程句柄,注意线程本身不能唤醒自己;);// 使用该函数挂起另一个线程时需要注意不知道该线程在做什么;// 例如,当该线程正在分配堆中内存,锁定完堆之后,被挂起,将不能让;// 其他线程使用堆,可能出现死锁;DWORD SuspendThread(HANDLE hThread// 线程句柄,线程本身可以挂起自己;);
  • 进程的挂起与恢复

Windows中不存在挂起进程的概念,但是可以枚举进程中所有线程来使进程中线程全部挂起或恢复

  • 线程睡眠

使用Sleep函数可以休眠自己,传入的参数是休眠的时间,Sleep函数有以下注意:

  1. 调用Sleep函数,将使线程资源放弃属于它的时间片中剩下部分
  2. 传入的时间只是近似值,因为Windows不是实时操作系统,取决于其他线程运行情况
  3. 当传入INFINITE,将使该线程永远不会调度,但这样做没意义,没有是线程直接退出好
  4. 传入0,表示该线程自愿放弃时间片,将CPU留给其他线程,当有相同或者较高优先级的线程则会调用那个线程,否则继续调用该线程
  • 切换到另一个线程

使用SwitchToThread可以是该线程放弃时间片,调度其他线程,与Sleep传入0函数不同的是,该函数可以调度优先级比它小的线程