Windows Via C/C++ 读书笔记 4
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,直到这个消息到了才恢复为"可执行"状态。