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

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函数不同的是,该函数可以调度优先级比它小的线程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值