欢迎来到天天文库
浏览记录
ID:35232905
大小:48.05 KB
页数:6页
时间:2019-03-22
《黑客手册第十五课多线程编程》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、黑客手册第十五课多线程编程本课中,我们将学习如何进行多线理编稽。另外我们还将学习如何在不同的线理间进行通理论:前课中,我们学习了进程,其中讲到每个进程至少要有个主线稽。这个线理其实是进程执行的条线索,除此主线理外您还可以给进程增加其它的线稽,也即增加其它的执行线索,由此在某种程度上可以看成是给个应用程序增加了多任务功能。当程序运行后,您可以根据各种条件挂起或运行这些线稽,尤其在多CPU的环境中,这些线程是并发运行的。这些是在W32下才有的概念,在WIN16下并没有等同的概念。在同进程中运行不同的线梧的好处是这些线稽可以共享进程的资源,如全局变量、资源等。当然各个线程也可以有自己的
2、私有校用于保存私有数据。另外每个线理需要保存其运行上下文以便在线理切换时能够记住或恢复其上下文,当然这是由操作系统来完成的,对于用户是透明的。我们大体上可以把线理分成两大类:1.处理用户界面的线理:该类线理产生自己的窗口并负责处理相关的窗口消息。用户界面线理遵守WIN16下的互斥原则,即没刻仅有个用户界面线理使用USER和GDI库中的内核函数,也就是说当个用户界面程序在进入GDI或USER中时,内核不允许重入。由此我们可以推论出WIN95的该部分内核的代码是遵守16位模式的。而WINOWSNT是纯的32位操作系统,所以不存在这个问题。2.工作者线理:该类线理不用处理窗口界面,当然
3、也就不用处理消息了。它般都运行在后台干些计算之类的粗,这大概也是把它叫做工作者线梧的原因吧。运用W32的多线理模式来编程,我们可以遵循某种策略:即让主线理仅来做用户界面的工作,而其它繁重的工作则交由工作者线埋在后台完成。这就好比我们日常生活中的许多例子。譬如:政府管理者好比是用户界面线稽,它负责昕取民意,给职能部门分配工作,然后把工作成果汇报给公众。而具体的职能部门就是工作者线稽,它负责完成下达的具体工作。如果让政府管理这来具体地做每件事,它必须作件事后再做另页,那它就不能及时来昕取和反馈民意。这样就无法管理好个国家了。当然即使采用多线理制,政府管理部门也不定就能管理好国家,但是
4、程序却可以采用多线理机制来管理好她自己的工作。我们可以调用CreateThread函数来生成新线稽。该函数的语法如下:CreateThreadproto1pThreadAttributes:DWORD,dwStackSize:DWORD,1pStartAddress:DWORD,1pParameter:DWORD,dwCreationF1ags:DWORD,1pThreadld:DWORD生成个线梧的函数和生成个进程基本相同。1pThreadAttributes-->如果您想要线理有缺省的安全属性,可以置该值为NULLdwStackSize-->指定线梧的堆校大小。如果
5、为0,那线梧的大小和进程相同。1pStartAddress-->线理函数的起始地址。注意该函数仅接收个32位的参数和返回个32位的值。(该参数可以是个指针,而且进程的线稽可以直接存取进程定义全局变量,所以fg大可不必担心不能如何把大量的参数传递给线理)。1pParameter-->传递给线梧的上下文。dwCreationF1ags-->如果是0的话则表示创线程建后立即启动,相反的是标志位CREATESUSPENDED,这样您需要稍后显示地让该线程运行。1pThreadld-->内核给新生成的线理分配的线理ID。如果生成线理成功的话,CreateThread函数就返回新线梧的句柄。
6、否则返回NULL。如果没有给参数dwCreationF1ags指定CREATESUSPENDED的话,该线程就会立即运行。如果不这样,我们上面说了,需要显示地启动该线稽,要这样做您需要调用ResumeThread函数。在线理返回后(线梧的执行类似与执行个函数,如果它调用了最后条指令后,在汇编中是ret,那么该线程就结束了,除非您让它进入个循环,譬如我们讲的用户界面线程就是如此,只不过它不退出的原因是进入的循环是在{whi1e(GetMessage(...))...}中,如果您没有给它传递个值为0的消息,那它可不会退出),系统会自动调用ExitThread函数透明地处理线理些退出时
7、的清理工作。当然您可以自己调用该函数,但似乎没有什么意义。要得到退出时的退出码,您可以调用GetExitCodeThread函数。如果您想结束个程序,可以调用TerminateThread函数,不过使用该函数要小心行事,因为该函数旦被调用线程就会退出,这样它就没有机会来做清理自己的工作了。现在我们来看看线理间的通讯机制。总的说来共有三种方法:.使用全局变量.使用Windows消息传递机制.使用事件上面我们说了线理会共享进程的资源,其中全局变量也包括在内,所以线稽可以通过使用全局变
此文档下载收益归作者所有