电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本
换一换
首页 金锄头文库 > 资源分类 > DOCX文档下载
分享到微信 分享到微博 分享到QQ空间

黑客手册第十五课 多线程编程

  • 资源ID:455781713       资源大小:48.05KB        全文页数:6页
  • 资源格式: DOCX        下载积分:15金贝
快捷下载 游客一键下载
账号登录下载
微信登录下载
三方登录下载: 微信开放平台登录   支付宝登录   QQ登录  
二维码
微信扫一扫登录
下载资源需要15金贝
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
如填写123,账号就是123,密码也是123。
支付方式: 支付宝    微信支付   
验证码:   换一换

 
账号:
密码:
验证码:   换一换
  忘记密码?
    
1、金锄头文库是“C2C”交易模式,即卖家上传的文档直接由买家下载,本站只是中间服务平台,本站所有文档下载所得的收益全部归上传人(卖家)所有,作为网络服务商,若您的权利被侵害请及时联系右侧客服;
2、如你看到网页展示的文档有jinchutou.com水印,是因预览和防盗链等技术需要对部份页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有jinchutou.com水印标识,下载后原文更清晰;
3、所有的PPT和DOC文档都被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;下载前须认真查看,确认无误后再购买;
4、文档大部份都是可以预览的,金锄头文库作为内容存储提供商,无法对各卖家所售文档的真实性、完整性、准确性以及专业性等问题提供审核和保证,请慎重购买;
5、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据;
6、如果您还有什么不清楚的或需要我们协助,可以点击右侧栏的客服。
下载须知 | 常见问题汇总

黑客手册第十五课 多线程编程

黑客手册第十五课 多线程编程本课中,我们将学习如何进行多线理编稽。另外我们还将学习如何在不同的线理间进行通理论:前 课中,我们学习了进程,其中讲到每个进程至少要有个主线稽。这个线理其实是进 程执行的 条线索,除此主线理外您还可以给进程增加其它的线稽,也即增加其它的执行线 索,由此在某种程度上可以看成是给个应用程序增加了多任务功能。当程序运行后,您可 以根据各种条件挂起或运行这些线稽,尤其在多CPU的环境中,这些线程是并发运行的。这些 是在W32下才有的概念,在WIN16下并没有等同的概念。在同 进程中运行不同的线梧的好处是这些线稽可以共享进程的资源,如全局变量、资源 等。当然各个线程也可以有自己的私有校用于保存私有数据。另外每个线理需要保存其运行 上下文以便在线理切换时能够记住或恢复其上下文,当然这是由操作系统来完成的,对于用 户是透明的。我们大体上可以把线理分成两大类:1.处理用户界面的线理:该类线理产生自己的窗口并负责处理相关的窗口消息。用户界面 线理遵守WIN16下的互斥原则,即没刻仅有个用户界面线理使用USER和GDI库中的内 核函数,也就是说当个用户界面程序在进入GDI 或USER中时,内核不允许重入。由此 我们可以推论出WIN95的该部分内核的代码是遵守16位模式的。而WINOWS NT是纯的32位 操作系统,所以不存在这个问题。2. 工作者线理:该类线理不用处理窗口界面,当然也就不用处理消息了。它 般都运行在 后台干 些计算之类的粗,这大概也是把它叫做工作者线梧的原因吧。运用W32的多线理模式来编程,我们可以遵循某种策略:即让主线理仅来做用户界面的工作, 而其它繁重的工作则交由工作者线埋在后台完成。这就好比我们日常生活中的许多例子。譬 如:政府管理者好比是用户界面线稽,它负责昕取民意,给职能部门分配工作,然后把工作 成果汇报给公众。而具体的职能部门就是工作者线稽,它负责完成下达的具体工作。如果让 政府管理这来具体地做每件事,它必须作件事后再做另 页,那它就不能及时来昕取和 反馈民意。这样就无法管理好个国家了。当然即使采用多线理制,政府管理部门也不 定 就能管理好国家,但是程序却可以采用多线理机制来管理好她自己的工作。我们可以调用 CreateThread函数来生成新线稽。该函数的语法如下:CreateThread proto 1pThreadAttributes:DWORD,dwStackSize:DWORD,1pStartAddress:DWORD,1pParameter:DWORD,dwCreationF1ags:DWORD,1pThreadld:DWORD生成个线梧的函数和生成个进程基本相同。1pThreadAttributes ->如果您想要线理有缺省的安全属性,可以置该值为NULLdwStackSize ->指定线梧的堆校大小。如果为0 ,那线梧的大小和进程相同。1pStartAddress-> 线理函数的起始地址。注意该函数仅接收个32位的参数和返回 个32位的值。(该参数可以是 个指针,而且进程的线稽可以直接存取进程定义全局变量,所以fg大可不必担心不能如何把大量的参数传递给线理)。1pParameter ->传递给线梧的上下文。dwCreationF1ags ->如果是0的话则表示创线程建后立即启动,相反的是标志位CREATE SUSPENDED,这样您需要稍后显示地让该线程运行。1pThreadld ->内核给新生成的线理分配的线理ID。如果生成线理成功的话,CreateThread函数就返回新线梧的句柄。否则返回NULL。 如果没有给参数dwCreationF1ags指定CREATE SUSPENDED的话,该线程就会立即运行。如果不 这样,我们上面说了,需要显示地启动该线稽,要这样做您需要调用ResumeThread函数。 在线理返回后(线梧的执行类似与执行 个函数,如果它调用了最后条指令后,在汇编中 是ret ,那么该线程就结束了,除非您让它进入个循环,譬如我们讲的用户界面线程就是如 此,只不过它不退出的原因是进入的循环是在 whi 1e ( GetMessage (. ) ).中,如果您 没有给它传递 个值为0的消息,那它可不会退出) ,系统会自动调用ExitThread函数透明地 处理线理 些退出时的清理工作。当然您可以自己调用该函数,但似乎没有什么意义。要得 到退出时的退出码,您可以调用GetExitCodeThread函数。如果您想结束 个程序,可以调用TerminateThread函数,不过使用该函数要小心行事,因为 该函数 旦被调用线程就会退出,这样它就没有机会来做清理自己的工作了。现在我们来看看线理间的通讯机制。 总的说来共有三种方法:.使用全局变量.使用Windows消息传递机制.使用事件 上面我们说了线理会共享进程的资源,其中全局变量也包括在内,所以线稽可以通过使用全局变量来通讯。但是这种办法的明显的缺点是在有多个线理存取同一个全局变量时,必须考虑同步的问题。譬如:有一个有十个成员变量的结构体,其中一个线埋在对起赋值时,假设只 更新了五个成员变量的值,这时内核的调度线理剥夺其运行权给另一个线稽,这样接下来的 线程如果想要用该全局结构体变量,它的值就显然不对了。另外多线梧的程序也很难调试, 尤其这些错误很隐蔽和很难复现时。如果两个线程都是用户界面线程时,用WINDOWS的消息机 制来进行线理间的通讯是比较方便的. 您所要做的只是自定义一些windows消息(注意不要和windows的预定义的消息冲突) ,然后 在线稽之间传递可以了。您可以这样来定义消息,把阳 USER (它的值等于Ox0400) 当作基 数,然后顺序地去加序号,譬如:H咀 MYCUSTOMMSG equ WM USER+100h小于阳 USER 的值是Windows系统的保留值,大于该值留给用户来使用。如果其中有 个线程是工作者线梧的话,那就不能用该种方法来进行通讯了,这是因为工作 者线埋没有消息队列。您应当用下面这种策略来进行工作者线程和用户界面线稽之间的通讯:Worker threadUser interface ThreadUser interface Thread -> globa1 variab1e(s)-> Worker Thread -> custom window message(s) ->稍后我们的例子中将讲解这种通讯办法。最后的办法是事件对象。您可以把事件对象看作是种标志。如果事件对象的状态是无信号 的话,说明该线程正在睡眠或挂起,在该种状态下系统是不会给该线理分配CPU时间片的。当个线梧的状态转成有信号时,WINDOWS就会唤醒该线理并且让它正常运行。例子:您可以下载例子并运行threadl.exe ,然后激活菜单项"Savage Calculation" ,然后程序开始执行指令"add eax,eax " 共执行600,000,000 次,您会发现在这个过程当中,用户界面将 停止日向应,您既不能使用菜单,也不能使用移动窗口。等到计算完成后,会弹出个对话 框,关闭掉对话框后窗口才可以和当初样正常运行了。 为了避免这种不便,我们把计算的工作放入到个单独的工作者线程中去,而主窗口仅仅晌 应用户的活动。您可以看到虽然用户界面的反应比平常时慢了,但还是可以工作的。.386 r【lodel flat,stdcalloption casemap:noneWinMain proto :DWORD,:DWORD,:DWORD,:DWORD include masm32includewindows.inc include masm32includeuser32. incinclude masm32includekerne132. inc includelib masm32libuser32. lib includelib masm32libkerne132.1ib. constIDM CREATE n配Eequ 1IDM EXIT equ 2WM FINISH equ WM USER+IOOh. dataClassName db "Win32ASMThreadClass",OAppNamedb "Win32 ASM MultiThreading Example",O MenuName db "FirstMenu",OSuccessString db "The calculation is completed!",O. data?hlnstance HINSTANCE ? CommandLine LPSTR ?hwnd HANDLE ? ThreadID DWORD ?. code start:invoke GetModuleHandle,NULLmovhlnstance,eax invoke GetCommandLine mov CommandLine,eaxinvoke WinMain,hlnstance,NULL,CommandLine,SW SHOWDEFAULTinvoke ExitProcess,eaxWinMain proc hlnst:HINSTANCE,hPrevlnst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD LOCAL wc:WNDCLASSEXLOCAL msg:MSGmovwc.cbSize,SIZEOF WNDCLASSEXmovwc.style,CS_HREDRAW or CS_VREDRAWmovwc.lpfnWndProc,OFFSET WndProc movwc.cbClsExtra,NULLmovwc.cbWndExtra,NULLpush hlnstpop wc.hlnstancemovwc.hbrBackgroun COLOR_WINDOW+lmovwc.lpszMenuName,OFFSET MenuName movwc.lpszClassName,OFFSET ClassName invoke Loadlcon,NULL,IDI APPLICATIONmovwc.hlcon,eax movwc. hlconS m,eaxinvoke LoadCursor,NULL,IDC ARROWmovwc.hCursor,eaxinvoke RegisterClassEx,addr wcinvoke CreateWindowEx,WS EX CLI 四TEDGE,ADDR ClassName,ADDR AppN础e,WS OVERLAPPEDWINDOW,CW USEDEFAULT, CW USEDEFAULT,300,200,NULL,NULL, hlnst,NULLmovhwnd,eaxinvoke ShowWindow,hwnd,SW SHOWNORMALinvoke UpdateWindow,hwnd. WHILE TRUEinvoke GetMessage,ADDR

注意事项

本文(黑客手册第十五课 多线程编程)为本站会员(壹****1)主动上传,金锄头文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即阅读金锄头文库的“版权提示”【网址:https://www.jinchutou.com/h-59.html】,按提示上传提交保证函及证明材料,经审查核实后我们立即给予删除!

温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.