1. 上下文
每个线程都有一个上下文(Context),上下文保存在线程的内核对象中,这个上下文反映了线程上一次执行时的CPU寄存器状态。Window大约每隔20ns会扫描所有的线程的内核对象,然后在可调度的线程中挑一个,并将该线程上次保存在线程上下文的值转入CPU寄存器,这一过程称为上下文切换。
2.线程的挂起和恢复
在线程内核对象中有一个值表示线程的挂起计数,当线程的挂起计数为0时,线程就成为可调度的。一个线程可以被多次挂起,如果一个线程被挂起三次,则在它有资格让系统为它分配CPU之前必须被恢复三次。当试图挂起一个线程时,必须小心,因为不知道线程在做什么,假如线程正在分配堆中的内存,线程将锁定堆,当其它线程要访问堆的时候,它们的执行将被中止。
3.睡眠
线程可以告诉系统,自己在一段时间内不需要调度了,可调用Sleep实现,关于Sleep,有几点需要注意:
1)调用Sleep,将使线程放弃属于它的时间片中剩下的部分;
2)系统设置线程不可调度的时间是不太准确的,因为Windows不是实时操作系统,实际情况取决于其它线程的运行情况。
3)可给Sleep传入0,这是告诉系统,线程放弃时间片的剩余部分,强制系统调度其他线程。
4.切换到其它线程
调用SwitchToThread函数,如果存在另一个可调度的线程,系统会让该线程运行。如果没有其他线程可运行,则函数将返回FALSE。SwithcToThread与Sleep传入0类似,区别是:SwithcToThread允许执行低优先级的线程,Sleep会立即重新调度主调线程,即使低优先级的线程还处于饥饿状态。