delphi中多线程分析详解

delphi中多线程分析详解

ID:6578760

大小:146.50 KB

页数:8页

时间:2018-01-18

delphi中多线程分析详解_第1页
delphi中多线程分析详解_第2页
delphi中多线程分析详解_第3页
delphi中多线程分析详解_第4页
delphi中多线程分析详解_第5页
资源描述:

《delphi中多线程分析详解》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、Delphi中多线程分析详解2009-3-2813:42:07 来源:转载 作者:James.Zhai 访问:3546次 被顶:4次 字号:【大中小】核心提示:多线程是多任务操作系统下一个重要的组成部分,它能够提高应用程序的效率,然而,我们想利用好多线程,必须要了解很多的东西...0.前言多线程是多任务操作系统下一个重要的组成部分,它能够提高应用程序的效率,然而,我们想利用好多线程,必须要了解很多的东西,比如操作系统的原理,堆栈概念和使用方法。然而,使用不当,将会造成无尽的痛苦。曾经刚刚接触的时候,我也为之恐惧,迷惑了好久。在无数次的失败和查找资料

2、解决问题之后,稍有感触,故写下此文,总结一下自己,同时,也给后学者一点启示,希望让他们少走弯路。 1.基础知识。线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。由于线程之间的相互制约,致使线程在运行中呈现出间断性。线程也有就绪、阻塞和运行三种基本状态。线程的生死。在windows中,我们可以通过调用APICreateThread/CreateRemoteT

3、hread创建一个线程(其实,在Windows内部,CreateThread最终是调用了CreateRemoteThread创建线程)。当线程函数执行退出时,可以说这个线程已经完成了它的使命。调用ExitThread可以结束一个线程,同时调用CloseHandle来释放Windows分配给它的句柄资源。GetExitCodeThread可以用来检测线程是否已经退出。HANDLECreateThread(LPSECURITY_ATTRIBUTESlpThreadAttributes,//SD,线程的属性DWORDdwStackSize,//initi

4、alstacksize,线程堆栈的大小LPTHREAD_START_ROUTINElpStartAddress,//threadfunction,线程函数LPVOIDlpParameter,//threadargument,参数DWORDdwCreationFlags,//creationoption,创建时的标志LPDWORDlpThreadId//threadidentifier,线程的ID);线程的控制。线程的有三种状态:就绪,阻塞,运行。当我们在CreateThread的时候,第5个参数为CREATE_SUSPENDED标志时,线程创建后就

5、处于挂起,即阻塞状态,否则,线程就会调用线程函数立即执行。ResumeThread可以让线程阻塞的线程继续运行,SuspendThread可以让线程挂起。(具体用法参考MSDN) 2.线程同步不同线程间公用同一个资源的时候,就需要进行线程同步。为何要同步?要回答好这个问题我们要从栈说起。这里说的栈,和数据结构中的堆栈是不一样的。(穿插一个小的知识:堆和栈的区别。以前看过一个帖子,里面有个很精辟的回复,说明了堆和栈的区别:“堆就像自己在家里做饭,想做什么就做什么,但是,最后的锅碗等还需要自己去收拾;而栈就像是去餐馆吃饭,只要你点好菜,餐馆就给你提供,

6、吃完之后锅碗什么的都不需要自己管。”,这说明堆和栈的区别以及如何使用它们:堆,可以自己完全控制,用完之后需要自己清理,处理不好就会造成内存泄漏;栈,由操作系统分配,不需要进行管理,不用担心内存泄漏)。简单的说,栈就是一块内存区域,它是从大到小增长的,它遵循后进先出的原则(FILO,FirstInLastOut)。通常,CPU的EBP和ESP是用作栈的,EBP是栈的基地址,EBP是当前栈顶的位置(栈顶永远是小于等于栈底的)。栈的主要作用就是保存现场,函数参数传递。对于栈的操作汇编中有两条指令:PUSH和POP,分别用于数据入栈和出栈。这两条指令可以影

7、响ESP的值,当然你也可以直接使用SUBESPXXX、ADDESPXXX这种方式来更改栈顶的位置。我们来看看函数的调用过程(这里不考虑调用惯例,仅仅是个示意):PUSHEBP//将当前栈底的位置压入栈SUBESP,XXXX//为函数开辟栈,XXXX为栈的大小PUSH参数//参数入栈CALLSomeAddress//调用函数ADDESP,XXXX//释放为函数开辟的栈(这里就解释了为什么我们不需要去管在栈上分配的内存)POPEBP//恢复EBP的位置每个线程有自己的栈,在CreateThread的时候,第二个参数就是用来指定线程的栈的大小,传入0时,

8、系统会自动分配栈的大小。现在看多线程使用共享资源(可以是公共变量,也可以是公共代码等)时的情况。如图,A和B共享一个资源S

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。