读书笔记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。



原文地址:https://www.cnblogs.com/findcaiyzh/p/74462.html