多线程笔记4

第五章:不要让线程成为脱缰野马

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)//挂起一个 线程

你可能感兴趣的:(多线程)