电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

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

6页
  • 卖家[上传人]:壹****1
  • 文档编号:455781713
  • 上传时间:2023-02-02
  • 文档格式:DOCX
  • 文档大小:48.05KB
  • / 6 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 1、黑客手册第十五课 多线程编程本课中,我们将学习如何进行多线理编稽。另外我们还将学习如何在不同的线理间进行通理论:前 课中,我们学习了进程,其中讲到每个进程至少要有个主线稽。这个线理其实是进 程执行的 条线索,除此主线理外您还可以给进程增加其它的线稽,也即增加其它的执行线 索,由此在某种程度上可以看成是给个应用程序增加了多任务功能。当程序运行后,您可 以根据各种条件挂起或运行这些线稽,尤其在多CPU的环境中,这些线程是并发运行的。这些 是在W32下才有的概念,在WIN16下并没有等同的概念。在同 进程中运行不同的线梧的好处是这些线稽可以共享进程的资源,如全局变量、资源 等。当然各个线程也可以有自己的私有校用于保存私有数据。另外每个线理需要保存其运行 上下文以便在线理切换时能够记住或恢复其上下文,当然这是由操作系统来完成的,对于用 户是透明的。我们大体上可以把线理分成两大类:1.处理用户界面的线理:该类线理产生自己的窗口并负责处理相关的窗口消息。用户界面 线理遵守WIN16下的互斥原则,即没刻仅有个用户界面线理使用USER和GDI库中的内 核函数,也就是说当个用户界面程序在进入GDI 或U

      2、SER中时,内核不允许重入。由此 我们可以推论出WIN95的该部分内核的代码是遵守16位模式的。而WINOWS NT是纯的32位 操作系统,所以不存在这个问题。2. 工作者线理:该类线理不用处理窗口界面,当然也就不用处理消息了。它 般都运行在 后台干 些计算之类的粗,这大概也是把它叫做工作者线梧的原因吧。运用W32的多线理模式来编程,我们可以遵循某种策略:即让主线理仅来做用户界面的工作, 而其它繁重的工作则交由工作者线埋在后台完成。这就好比我们日常生活中的许多例子。譬 如:政府管理者好比是用户界面线稽,它负责昕取民意,给职能部门分配工作,然后把工作 成果汇报给公众。而具体的职能部门就是工作者线稽,它负责完成下达的具体工作。如果让 政府管理这来具体地做每件事,它必须作件事后再做另 页,那它就不能及时来昕取和 反馈民意。这样就无法管理好个国家了。当然即使采用多线理制,政府管理部门也不 定 就能管理好国家,但是程序却可以采用多线理机制来管理好她自己的工作。我们可以调用 CreateThread函数来生成新线稽。该函数的语法如下:CreateThread proto 1pThreadAttri

      3、butes: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。

      4、如果没有给参数dwCreationF1ags指定CREATE SUSPENDED的话,该线程就会立即运行。如果不 这样,我们上面说了,需要显示地启动该线稽,要这样做您需要调用ResumeThread函数。 在线理返回后(线梧的执行类似与执行 个函数,如果它调用了最后条指令后,在汇编中 是ret ,那么该线程就结束了,除非您让它进入个循环,譬如我们讲的用户界面线程就是如 此,只不过它不退出的原因是进入的循环是在 whi 1e ( GetMessage (. ) ).中,如果您 没有给它传递 个值为0的消息,那它可不会退出) ,系统会自动调用ExitThread函数透明地 处理线理 些退出时的清理工作。当然您可以自己调用该函数,但似乎没有什么意义。要得 到退出时的退出码,您可以调用GetExitCodeThread函数。如果您想结束 个程序,可以调用TerminateThread函数,不过使用该函数要小心行事,因为 该函数 旦被调用线程就会退出,这样它就没有机会来做清理自己的工作了。现在我们来看看线理间的通讯机制。 总的说来共有三种方法:.使用全局变量.使用Windows消息传递机制.使用

      5、事件 上面我们说了线理会共享进程的资源,其中全局变量也包括在内,所以线稽可以通过使用全局变量来通讯。但是这种办法的明显的缺点是在有多个线理存取同一个全局变量时,必须考虑同步的问题。譬如:有一个有十个成员变量的结构体,其中一个线埋在对起赋值时,假设只 更新了五个成员变量的值,这时内核的调度线理剥夺其运行权给另一个线稽,这样接下来的 线程如果想要用该全局结构体变量,它的值就显然不对了。另外多线梧的程序也很难调试, 尤其这些错误很隐蔽和很难复现时。如果两个线程都是用户界面线程时,用WINDOWS的消息机 制来进行线理间的通讯是比较方便的. 您所要做的只是自定义一些windows消息(注意不要和windows的预定义的消息冲突) ,然后 在线稽之间传递可以了。您可以这样来定义消息,把阳 USER (它的值等于Ox0400) 当作基 数,然后顺序地去加序号,譬如:H咀 MYCUSTOMMSG equ WM USER+100h小于阳 USER 的值是Windows系统的保留值,大于该值留给用户来使用。如果其中有 个线程是工作者线梧的话,那就不能用该种方法来进行通讯了,这是因为工作 者线埋没有消息队

      6、列。您应当用下面这种策略来进行工作者线程和用户界面线稽之间的通讯: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 次,您会发现在这个过程当中,用户界面将 停止日向应,您既不能使用菜单,也不能使用移动窗口。等到计算完成后,会弹出个对话 框,关闭掉对话框后窗口才可以和当初样正常运行了。 为了避免这种不便,我们把计算的工作放入到个单独的工作者线程中去,而主窗口

      7、仅仅晌 应用户的活动。您可以看到虽然用户界面的反应比平常时慢了,但还是可以工作的。.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

      8、 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,NULLmovw

      9、c.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分享,可在线阅读,更多相关《黑客手册第十五课 多线程编程》请在金锄头文库上搜索。

      点击阅读更多内容
    最新标签
    监控施工 信息化课堂中的合作学习结业作业七年级语文 发车时刻表 长途客运 入党志愿书填写模板精品 庆祝建党101周年多体裁诗歌朗诵素材汇编10篇唯一微庆祝 智能家居系统本科论文 心得感悟 雁楠中学 20230513224122 2022 公安主题党日 部编版四年级第三单元综合性学习课件 机关事务中心2022年全面依法治区工作总结及来年工作安排 入党积极分子自我推荐 世界水日ppt 关于构建更高水平的全民健身公共服务体系的意见 空气单元分析 哈里德课件 2022年乡村振兴驻村工作计划 空气教材分析 五年级下册科学教材分析 退役军人事务局季度工作总结 集装箱房合同 2021年财务报表 2022年继续教育公需课 2022年公需课 2022年日历每月一张 名词性从句在写作中的应用 局域网技术与局域网组建 施工网格 薪资体系 运维实施方案 硫酸安全技术 柔韧训练 既有居住建筑节能改造技术规程 建筑工地疫情防控 大型工程技术风险 磷酸二氢钾 2022年小学三年级语文下册教学总结例文 少儿美术-小花 2022年环保倡议书模板六篇 2022年监理辞职报告精选 2022年畅想未来记叙文精品 企业信息化建设与管理课程实验指导书范本 草房子读后感-第1篇 小数乘整数教学PPT课件人教版五年级数学上册 2022年教师个人工作计划范本-工作计划 国学小名士经典诵读电视大赛观后感诵读经典传承美德 医疗质量管理制度 2
    关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
    手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
    ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.