- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
MFC 多线程程序设计
Multi-threaded Programming in MFC
线程(thread),是执行线程(thread of execution)的简单称呼。Thread 这个字的原意是「线」。
中文字里头的「线程」也有「线」的意思,所以我采用「线程」、「执行线程」这样的中文名
称。如果你曾经看过「多线」这个名词,其实就是本章所谓的「多线程」。
我曾经在第1章以三两个小节介绍Win32 环境下的进程与执行线程观念,并且以程序直接
调用CreateThread 的形式,示范了几个Win32 小例子。现在我要更进一步从操作系统
的层面谈谈执行线程的学理基础,然后带引各位看看MFC 对于「执行线程」支持了什么样
的类别。然后,实际写个MFC 多线程程序。
从操作系统层面看执行线程
书籍推荐:如果要从操作系统层面来了解执行线程,Matt Pietrek 的Windows 95 System
Programming SECRETS(Windows 95 系统程序设计大奥秘/侯俊杰译/旗标出版)无疑是
最佳知识来源。Matt 把操作系统核心模块(KERNEL32.DLL)中用来维护执行线程生存的
数据结构都挖掘出来,非常详尽。这是对执行线程的最基础认识,直达其灵魂深处。
你已经知道,CreateThread 可以产生一个执行线程,而「线程」的本体就是CreateThread 第
3个参数所指定的一个函数(一般我们称之为「执行线程函数」)。这个函数将与目前的
「执行事实」同时并行,成为另一个「执行事实」。执行线程函数的执行期,也就是该执
行线程的生命期。
操作系统如何造成这种多任务并行的现象?执行线程对于操作系统的意义到底是什么?系统
如何维护许多个执行线程?执行线程与其父亲大人(进程)的关系如何维持?CPU 只有一
个,执行线程却有好几个,如何摆平优先权与排程问题?这些疑问都可以在下面各节中获
得答案。
三个观念:模块、进程、执行线程
试着回答这个问题:进程(process)是什么?给你一分钟时间。
z z z z z...
你的回答可能是:『一个可执行档执行起来,就是一个进程』。唔,也不能算错。但能
不能够有更具体的答案?再问你一个问题:模块(module)是什么?可能你的回答还是:
『一个可执行档执行起来,就是一个模块』。这也不能够算错。但是你明明知道,模块
不等于进程。KERNEL32 DLL 是一个模块,但不是一个进程;Scribble EXE 是一个模块,
也是一个进程。
我们需要更具体的资料,更精准的答案。
如果我们能够知道操作系统如何看待模块和进程,就能够给出具体的答案了。一段可执
行的程序(包括EXE 和DLL),其程序代码、资料、资源被加载到内存中,由系统建
置一个数据结构来管理它,就是一个模块。这里所说的数据结构,名为Module Database
(MDB),其实就是PE 格式中的PE 表头,你可以从WINNT.H 档中找到一个
IMAGE_NT_HEADER 结构,就是它。
好,解释了模块,那么进程是什么?这就比较抽象一点了。这样说,进程就是一大堆拥
有权(ownership)的集合。进程拥有地址空间(由memory context 决定)、动态配置而
来的内存、文件、执行线程、一系列的模块。操作系统使用一个所谓的Process Database
(PDB)数据结构,来记录(管理)它所拥有的一切。
执行线程呢?执行线程是什么?进程主要表达「拥有权」的观念,执行线程则主要表达模块中
的程序代码的「执行事实」。系统也是以一个特定的数据结构(Thread Database,TDB)记
录执行线程的所有相关资料,包括执行线程区域储存空间(Thread Local Storage,TLS)、讯
息队列、handle 表格、地址空间(Memory Context)等等等。
最初,进程是以一个执行线程(称为主执行线程,primary thread)做为开始。如果需要,行
程可以产生更多的执行线程(利用CreateThread),让CPU 在同一时间执行不同段落的
码。当然,我们都知道,在只有一颗CPU 的情况下,不可能真正有多任务的情况发生,
「多个执行线程同时工作」的幻觉主要是靠排程器来完成-- 它以一个硬件定时器和一组复
杂的游戏规则,在不同的执行线程之间做快速切换动作。以Windows 95 和Windows NT
而言,在非特殊的情况下,每个执行线程被CPU 照顾的时间(所谓的timeslice)是20 个
milliseconds。
如果你有一部多CPU 计算机,又使用一套支持多CPU 的操作系统(如Windows NT),
那么一个CPU 就可以分配到一个执行线程,真正做到实实在在的多任务。这种
文档评论(0)