网站大量收购独家精品文档,联系QQ:2885784924

Windows多线程技术讲解.ppt

  1. 1、本文档共25页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Windows多线程技术讲解

Windows多线程技术 程序和进程 程序计算机指令的集合,它以文件的形式存储在磁盘上进程通常被定义为一个正在运行的程序的实例,是一个程序在其自身的地址空间中的一次执行活动区别:进程是资源申请、调度和独立运行的单位,因此,它使用系统中的运行资源;而程序不能申请系统资源,不能被系统调度,也不能作为独立的运行的单位,?因此,他不占用系统的运行资源。 进程由两个部分组成: ?1、操作系统用来管理进程的内核对象。内核对象是操作系统内部分配的一个内存块,内核对象也是系统用来存放关于进程的统计信息的地方。(PCB) 程序和进程 ?2、地址空间。它包含所有可执行模块或DLL模块的代码和数据。他还包含动态内存分配的空间。如线程堆栈和堆分配空间。 内核对象:是操作系统内部分配的一个内存块,它是一种只能被内核访问的数据结构,?其成员负责维护该对象的各种信息,应用程序无法找到并直接改变它们的内容,只能通过Windows提供的函数对内核对象进行操作。 进程 进程 进程是不活泼的。进程从来不执行任何东西,它只是线程的容器。若要使进程完成某项操作,它必须拥有一个在它的环境中运行的线程,此线程负责执行包含在进程的地址空间中的代码。单个进程可能包含若干个线程,这些线程都“同时”执行进程地址空间中的代码。 每个进程至少拥有一个线程,来执行进程的地址空间中的代码。当创建一个进程时,操作系统会自动创建这个进程的一个线程,称为主线程。此后,该线程可以创建其他的线程。 线程 线程有两个部分组成: ?1。线程的内核对象,操作系统用它来对线程实施管理,内核对象也是系统用来存放线程统计信息的地方。TCB ?2。线程堆栈,它用于维护线程在执行代码时需要的所有参数和局部变量。 当创建线程时,系统创建一个线程内核对象。 该线程内核对象不是线程本身,而是操作系统用来管理线程的较小的数据结构。 可以将线程内核对象视为由关于线程的统计信息组成的一个小型数据结构。 线程和进程 线程总是在某个进程环境中创建。 系统从进程的地址空间中分配内存,供线程的堆栈使用。 新线程运行的进程环境与创建线程的环境相同。因此,新线程可以访问进程的内核对象的所有句柄、进程中的所有内存。 线程运行 对于单个CPU操作系统为每一个运行线程安排一定的CPU时间——时间片。系统通过一种循环的方式为线程提供时间片,线程在自己的时间内运行,因时间片相当短,因此,给用户的感觉,就好像线程是同时进行的一样。如果计算机拥有多个CPU,线程就能真正意义上运行了。 进程与线程 现代操作系统都是多任务抢占式的操作系统,是指将CPU时间片分配最需要它的应用程序,即便一个应用程序永远不打算放弃CPU,操作系统也能保证随时抢占CPU时间,然后对当前所有的任务进行合理的调度。 要实现多任务,系统有一个核心调度程序,负责为每一个任务分配CPU时间,允许其执行指定的一段时间,当这段时间用完后,控制权会重新交回到操作系统,操作系统可在此时重新分配CPU时间。 何时使用多线程 线程有什么用?MSDN给出的答案是等。 在需要等待的地方,多线程确实能够发挥很高的效能。举一个例子:一个网络程序向远程主机发送了一个请求,正在等待回应,而在此期间,它还希望能够与用户进行交互。一种实现方法是:程序继续与用户交互,在交互的间歇检查一下回应是否到达。而更好的方法是建立一个新的线程(称为工作线程)来等待回应,原始线程继续照常与用户交互。后一种方法比前一种方法好在后者执行的指令更少,因而效率更高。如果您对Windows编程熟悉:在实现前者时,必须保证能够及时检测到回应到达,因而就不能使用GetMessage() 而要使用PeekMessage()。如果使用GetMessage(),而恰巧在很长的一段时间内都没有消息到达,原始线程就不会从GetMessage()返回,也就不能检测回应是否到达。使用PeekMessage(),可以令其在没有消息时也立即返回,因而可以检测回应是否到达。网络部分的情况也一样--程序不能等回应一直等下去否则就无法与用户交互。无论如何,在即没有消息、也没有回应到达的情况下,原始线程没有有效的进入等待状态,而是不停地空转,检测二者中是否有到达的,这对系统资源显然是极大的浪费。 线程间的通讯 但是,新的问题又出现了,工作线程发现回应已经到达了,它可能要通知原始线程才行--它与原始线程是并发执行的。这就涉及到线程间通信了,有一种最简单的方法:Windows消息。工作线程通过向原始线程的窗口发送一个消息,然后终止;当原始线程的消息循环发现这个消息时,就知道回应已经到达了。线程间通信的方法还有很多,将在以后专门介绍。  最后要说明的是--很重要的一点:多线程经常不是程序员主动来使用的,而是在依赖操作系统时,已然是多线程了。即使用,也很有节制

文档评论(0)

33ggoup + 关注
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档