读书笔记--Win32多线程程序设计(1)
很早就想系统的看看多线程方面的书籍,逮到机会:)
1。多线程的简单定义:使程序得以将其工作分开,独立运作,不互相影响。
2。多线程的最众所周知的应用场景:执行大量操作是,UI死掉。
3。线程历史:
Dos -- 单进程单线程,TSR实际并不是多线程,TSR只是可以将程序看作是系统的一部分。但是,如果格式化一张软盘,TSR和整个DOS操作系统都动弹不得。
Windows3.0及之前版本为合作型多任务,也就是说,一个程序是否放开CPU资源,完全取决于自己,其它程序包括系统都无权干涉。(目前还可以使用的PeekMessage(),大概就诞生于此时吧)
WindowsNT 完全支持32位程序的抢先式多任务,此时Windows进入了一个多线程多任务,并具有高度安全防护性得系统,这本书便是基于WindowsNT所写。
4。 线程原理:单CPU的计算机可以让人感觉好像几个程序一起执行,其核心为Context Switching(应该是"上下文切换"?算了,保留英文吧)。抢先式多任务,即当操作系统认为一个线程执行的已经够久了,就发出中断,于是CPU取得当前线程的当前状态,也就是把所有寄存器内容拷贝到堆栈中,再把它从堆栈拷贝到一个Context结构中,以备以后使用。然后载入等待队列中的一个线程的Context。
5。核心对象:一种Handle ,其指向操作系统内存控件的某种东西,为了维护系统的安全性和完整性,不能直接取得和使用。与GDI对象不同,核心对象可以有1个以上的拥有者,甚至可以跨进程。核心对象保持了一个引用计数,以记录多少个Handles引用了此对象,也记录了哪一个进程或者线程是拥有者。
6。CloseHandle的重要性:一个线程核心对象开始时默认的引用计数为2,一个是自己,另一个是启动这个线程的线程。线程结束可以使前者减1;而在启动这个线程的线程代码中,使用CloseHandle 将使得后者减1。只有引用计数被减为0,线程核心对象才能释放,我们经常忘记后者。
7。 一些线程相关的函数:
开始一个线程
HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes, //新线程的security属性,NULL表示使用缺省值
SIZE_T dwStackSize, // 堆栈大小,0为默认值1M
LPTHREAD_START_ROUTINE lpStartAddress, //启动地址,在c中可以使用函数名称
LPVOID lpParameter, //传给线程的参数
DWORD dwCreationFlags, //线程开始时状态,默认为开始时立即执行
LPDWORD lpThreadId //返回线程ID
);
BOOL CloseHandle(HANDLE hObject); //hObject为已经打开的对象的Handle。
BOOL GetExitCodeThread(HANDLE hThread, //线程对象的Handle
LPDWORD lpExitCode //线程的退出代码(exit code)
);
ExitThread(DWORD dwExitCode); //指定此线程的退出代码(exit code)
8。GUI线程和worker线程的区别:GUI线程负责建造窗口和处理主消息循环,worker线程执行纯粹的运算工作。由于GUI线程负责处理消息循环,因此不能被大量的运算阻塞住,否则UI将失去反应。而worker线程,不能产生窗口,因为只要一关联到窗口,它就不再叫做worker线程了。
9。