Windows Via C/C++ 读书笔记 4 线程调度 优先级

这篇读书笔记详细介绍了Windows系统中线程调度、优先级和亲和性。内容涵盖线程的暂停与恢复、Sleep函数、SwitchToThread和YieldProcessor宏,以及线程和进程的优先级设定。文章强调了高优先级线程如何抢占CPU,并讨论了线程亲和性在多CPU环境下的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Windows Via C/C++ 读书笔记 

1. Thread Scheduling, Priorities, and Affinities

1.1. 暂停和恢复线程

线程内核对象有一个Suspending计数,每对线程做Suspending操作,该计数加一。

如果该计数不为0,线程不会被执行。

因此要Resume一个线程,必须调用相同次数的Resume操作。

1.2. 暂停和恢复进程

操作系统不提供这样一种方法。作者提供了一个不完美的解决方案:

CreateToolhelp32Snapshot获取进程的快照信息(包括所有的线程id

遍历所有的线程,逐个暂停或恢复线程

这么做的问题是,获取进程快照到遍历线程这段时间,可能线程已经被销毁,也可能有新的线程被创建,因此是不可靠的。只有你能保证你的代码不会出现这种情况,才能使用。关键是整个操作不是原子性的,也不能对进程做锁定。

1.3. Sleep

太简单了,不浪费字了

1.4. SwitchToThread

相当于Sleep(0),让出cpu给其它线程,如果没有继续执行。

1.5. YieldProcessor让出CPU 

超线程处理器使用YieldProcessor 宏让出CPU,如果CPU不支持,这个宏为空。

这个操作的切换时间比较小,效率高。这个宏在winnt.h中定义:

#define YieldProcessor() 

#define YieldProcessor() __asm { rep nop }

#define YieldProcessor __yield

1.6. 线程优先级

线程共有0-31 32个优先级,31最高,0给唯一的内存清零线程使用,这个线程会把不使用的内存页面清零。

CPU总是让"可执行"(excutable)的线程中优先级最高的线程运行。不用担心优先级低的线程永远得不到CPU运行时间(饥饿状态),虽然这是可能的。因为线程一般不会永远处于"可执行"状态,比如等待某个消息,它就会让出CPU,直到这个消息到了才恢复为"可执行"状态。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值