第五章:不要让线程成为脱缰野马
1.干净的终止一个线程
(1)BOOL TerminateThread(HANDLE hThread, DWORD dwExitCode)//dwExitCode:线程结束代码。
线程在结束前没有机会清理自己,且堆栈不会释放,产生内存泄露。相关的DLLs没有机会获得”线程解除附着”的通知。这是一个危险的函数,非不得已的情况不用。
(2)使用信号(Signals),行不通。
(3)跨越线程,丢出异常。win32API中没有什么标准方法可以把一个异常情况丢到另一个线程中。
(4)设立一个标记:使用一个手动重置(manual-reset)的 event 对象。Worker 线程可以检查该event 的状态或是等待它。
2.线程优先权
(1)以进程的“优先权类别(priority class)”、线程的“优先权层级 (priority level)”和操作系统当时采用的“动态提升(Dynamic Boost)”作为计算基准。拥有最高优先权之线程,即为下一个将执行起来的线程.如果优先权相同,则轮流调度。
(2)4个优先权类别 ,两个相关函数:SetPriorityClass,GetPriorityClass
HIGH_PRIORITY_CLASS 13
IDLE_PRIORITY_CLASS 4
NORMAL_PRIORITY_CLASS 7 or 8
REALTIME_PRIORITY_CLASS 24
(3)7个优先权层级
THREAD_PRIORITY_HIGHEST +2
THREAD_PRIORITY_ABOVE_NORMAL +1
THREAD_PRIORITY_NORMAL 0
THERAD_PRIORITY_BELOW_NORMAL -1
THREAD_PRIORITY_LOWEST -2
THREAD_PRIORITY_IDLE set to 1
THREAD_PRIORITY_TIME_CRITICAL set to 15
BOOL SetThreadPriority(HANDLE hThread, int nPriority);
int GetThreadPriority(HANDLE hThread);
(4)动态提升
3.初始化一个线程
(1)初始化理由:调整优先权;绑核等。
(2)CreateThread()第五个参数设为CREATE_SUSPENDED
(3)DWORD ResumeThread(HANDLE hThread)//执行一个线程
(4)DWORD SuspendThread(HANDLE hThread)//挂起一个 线程