一、线程的生命周期
1、主线程调用 CreateThread
2、内核记数为2(一个是句柄的,一个是线程函数的)
3、NTDLL.DLL调用RtlUserThreadStart 启动线程函数
4、或者线程函数返回,线程生命周期结束
5、或者线程自己调用ExitThread 杀死自己
6、或者其他线程调用TerminateThread 杀死其他线程 (异步的,且不会销毁线程栈,也不会调用DllMain函数传入DLL_THREAD_DETACH)
二、其他需要注意的问题
1、不要使用 CreateThread 等函数,而要使用_beginthreadex 等函数
理由:beginthreadex 会保护与该线程关联的C、C++运行库函数的内存块。
2、GetCurrentProcess、GetCurrentThread 返回的是伪句柄
可以使用DuplicateHandle 将伪句柄转换为真正的句柄。伪句柄不会将使用计数加一。