线程的挂起和恢复
线程内核中各有一个值表示线程的挂起计数。调用CreateProcess或者CreateThread时,系统将创建线程内核对象,并把挂起计数初始化为1。这样便不会给这个线程调度CPU了。
在线程初始化后,CreateProcess或者CreateThread函数将查看是否有CREATE_SUSPENDED标志传入。如果有,则函数返回,新线程立刻挂起。如果没有,函数会将线程的挂起计数递减为0,这时新线程变为可调度的,除非它还在等待某个事件发生(例如键盘输入等)。
当我们创建了一个处于挂起状态的线程后,我们可以使用ResumeThread函数:DWORD ResumeThread(HANDLE hThread);
如果函数调用成功,其返回线程前一个挂起计数。否则,它将返回0xffffffff。
一个线程可以被挂起多次,相应也要恢复多次。除了在创建线程时使用CREATE_SUSPENDED标志外,还可以通过调用SuspendThread来挂起线程。
DWORD SuspendThread(HANDLE hThread);
任何线程都可以调用这个函数挂起另一个线程(只要有线程句柄)。显然,线程可以挂起自己,但是无法自己恢复。SuspendThread返回的也是之前的挂起计数。一个线程最多可以挂起MAXIMUM_SUSPEND_COUNT(127)次。
睡眠
线程还可以告诉系统,在一段时间内自己不需要调度了。这可以通过调用Sleep实现:
VOID Sleep(DWORD dwMilliseconds);
调用此函数意味着:1.线程自愿放弃属于它的时间片中剩下的部分。
2.如果传入INFINITE,则是告诉系统,永远不要调度这个线程。
3.传入0,则是告诉系统,放弃当前cpu时间片的剩余时间。
## 线程执行时间 ##
可以使用GetThreadTimes函数,
BOOL GetThreadTimes(
HANDLE hThread,
PFILETIME pftCreationTime,
PFILETIME pftExitTime,
PFILETIME pftKernelTime,
PFILETIME pftUserTime);
这个函数返回四个不同的时间,创建时间:用100ns为单位,表示线程创建的绝对时间。