1. 线程 = 线程内核对象 + 线程栈
线程栈用于维护线程执行时所需的所有函数参数和局部变量
2. 线程共享同一地址空间,线程共享内核对象句柄,因为句柄表是针对每一个进程的而不是针对线程的。
3. 进程所使用的系统资源更多。其原因在于地址空间。(为一个进程创建一个虚拟的地址空间需要大量的系统资源,系统中会发生大量的记录活动,而这需要大量的内存)
4. 所有窗口应该由同一个线程创建
实践:用户界面线程 + 受限于计算能力或IO的工作线程(永远不创建窗口)
5. 线程函数应尽可能使用函数参数和局部变量。使用静态变量和全局变量时,多个线程可以同时访问这些变量。这样可能破坏变量中保存的内容。
6. 新线程可以访问进程内核对象的所有句柄、进程中的所有内存以及同一进程中其他所有线程的栈,这样一来,同一个进程中的多个线程可以很容易地相互通信
7. 无穷递归会耗尽线程的栈
8. 一个线程有两个用户对象: 窗口和挂钩。 一个线程终止时,系统会自动销毁由线程创建或安装的任何窗口。并卸载由线程创建或安装的挂钩。
9. 每个线程都有自己的一组cpu寄存器。 称为线程上下文(context)
上下文: 指令指针寄存器 IP
栈指针寄存器 SP
其它
10. p52
createthread(.... RtluserThreadStart, pvParam);
void RtlUserThreadStart ()
{
线程函数 <--------------- 线程不能退出此函数,始终在其内部消亡。
exitprocess
}
11. 使用_beginthreadex 而不是使用createThread p161