- 1、本文档共8页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Delphi中多线程分析详解.doc
Delphi中多线程分析详解
2009-3-28 13:42:07 来源: 转载 作者:James.Zhai 访问:3546 次 被顶:4 次 字号:【大 中 小】
核心提示:多线程是多任务操作系统下一个重要的组成部分,它能够提高应用程序的效率,然而,我们想利用好多线程,必须要了解很多的东西...
0. 前言
多 线程是多任务操作系统下一个重要的组成部分,它能够提高应用程序的效率,然而,我们想利用好多线程,必须要了解很多的东西,比如操作系统的原理,堆栈概念 和使用方法。然而,使用不当,将会造成无尽的痛苦。曾经刚刚接触的时候,我也为之恐惧,迷惑了好久。在无数次的失败和查找资料解决问题之后,稍有感触,故写下此文,总结一下自己,同时,也给后学者一点启示,希望让他们少走弯路。
?
1. 基础知识。
线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其它线程 共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。由于线程之间的相互制约,致使线程在运行中呈现出 间断性。线程也有就绪、阻塞和运行三种基本状态。
线程的生死。在windows中,我们可以通过调用API CreateThread/CreateRemoteThread创建一个线程(其实,在Windows内部,CreateThread最终是调用了CreateRemoteThread创建线程)。当线程函数执行退出时,可以说这个线程已经完成了它的使命。调用ExitThread可以结束一个线程,同时调用CloseHandle来释放Windows分配给它的句柄资源。GetExitCodeThread可以用来检测线程是否已经退出。
HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes, // SD,线程的属性
DWORD dwStackSize, // initial stack size,线程堆栈的大小
LPTHREAD_START_ROUTINE lpStartAddress, // thread function,线程函数
LPVOID lpParameter, // thread argument,参数
DWORD dwCreationFlags, // creation option,创建时的标志
LPDWORD lpThreadId // thread identifier,线程的ID
);
线程的控制。线程的有三种状态:就绪,阻塞,运行。当我们在CreateThread的时候,第5个参数为CREATE_SUSPENDED标志时,线程创建后就处于挂起,即阻塞状态,否则,线程就会调用线程函数立即执行。ResumeThread可以让线程阻塞的线程继续运行,SuspendThread可以让线程挂起。(具体用法参考MSDN)
?
2. 线程同步
不同线程间公用同一个资源的时候,就需要进行线程同步。
为何要同步?要回答好这个问题我们要从栈说起。这里说的栈,和数据结构中的堆栈是不一样的。(穿插一个小的知识: 堆 和栈的区别。以前看过一个帖子,里面有个很精辟的回复,说明了堆和栈的区别:“堆就像自己在家里做饭,想做什么就做什么,但是,最后的锅碗等还需要自己去 收拾;而栈就像是去餐馆吃饭,只要你点好菜,餐馆就给你提供,吃完之后锅碗什么的都不需要自己管。”,这说明堆和栈的区别以及如何使用它们:堆,可以自己 完全控制,用完之后需要自己清理,处理不好就会造成内存泄漏;栈,由操作系统分配,不需要进行管理,不用担心内存泄漏)。简单的说,栈就是一块内存区域, 它是从大到小增长的,它遵循后进先出的原则(FILO,First In Last Out)。通常,CPU的EBP和ESP是用作栈的,EBP是栈的基地址,EBP是当前栈顶的位置(栈顶永远是小于等于栈底的)。栈的主要作用就是保存现场,函数参数传递。对于栈的操作汇编中有两条指令:PUSH和POP,分别用于数据入栈和出栈。这两条指令可以影响ESP的值,当然你也可以直接使用SUB ESP XXX、ADD ESP XXX这种方式来更改栈顶的位置。我们来看看函数的调用过程(这里不考虑调用惯例,仅仅是个示意):
PUSH EBP // 将当前栈底的位置压入栈
SUB ESP, XXXX // 为函数开辟栈,XXXX为栈的大小
PUS
文档评论(0)