挂起和重启线程
在线程内核对象中有一个标记线程挂起的计数器,当你调用CreateProcess或CreateThread函数时线程内核对象初始化为1,这样就可以在线程完成所有初始化工作之前阻止CPU调度它。
当线程被完全初始化后,CreateProcess或CreateThread函数检查是否传递了CREATE_SUSPENDED标识。如果传递了则函数返回后,线程出于挂起状态;如果没有传递,则将线程挂起计数器置为0,使得线程处于可调度状态。
创建一个挂起的线程可以让你在线程挂起期间做一些设置,修改线程环境(比如优先级等等)。在完成这些设置后,你最终还是得让线程处于可调度状态,这是就需要用到ResumeThread函数了。该函数如果成功,则返回前一个挂起计数器;如果失败则返回0xFFFFFFFF。
一个线程可以被多次挂起,线程挂起函数:SuspendThread函数。需要注意的是:如果一个线程调用被挂起三次,那么你也要调用ResumeThread函数将其解挂三次才行,两者必须一一对应。在实际编程过程,要慎重使用SuspendThread函数,因为你不一定明确该线程正在做什么工作,如果它正在申请堆栈,你这时将其挂起,就是个麻烦事。
Sleep函数
一个线程可以告诉系统:在一定时期内它不想被调度执行,这时就需要用到Sleep函数了,函数原型如下:VOID WINAPI Sleep( __in DWORDdwMilliseconds );这个函数能将线程挂起直到dwMilliseconds时间耗尽,对于这个函数需要注意的是:
1. 调用Sleep使线程自动发现余下的CPU时间片。
2. 系统使得线程在指定的时间间隔内不能被调度。
3. 你可以传递INFINITE作为参数,这样改线程将永远不会被调用;不过这样做似乎没什么意义,还不如直接退出线程,让系统好回收堆栈和内核对象。
4. 你可以传递参数0,这样就相当于告诉系统该线程自动放弃余下的CPU时间片。