mt线程的创建和运行.ppt

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

线程的创建和运行 第三章 线程的创建和运行 3.1 基本概念 3.2 线程的创建 3.3 终止线程 3.4 线程的暂停与回复 3.5 在类中使用线程 3.1 基本概念 Windows进程 进程的四种入口函数 intWINAPI WindMain() | WinMainCRTStartup ¨ intWINAPI wWinMain() | wWindMainCRTStartup ¨ int__cdeclmain() | mainCRTStartup ¨ int__cdeclwMain() | wmainCRTStartup 操作系统不直接调用入口函数, 而是调用c/c++运行库的启动函数 操作系统启动进程 检索指向新进程的完整命令行的指针 检索指向新进程的环境变量的指针 对C/C++运行期的全局变量初始化 对C 运行期内存单元分配函数(malloc和calloc)和其他的底层输出输入例程使用的内存堆进行初始化 为所有全局和静态的C++对象调用构造函数 线程的构成 线程的内核对象,操作系统用它来对线程实施管理 线程堆栈,用于维护线程在执行代码时候需要的所有函数局部变量。 线程上下文(一组CPU寄存器状态,特别是指令指针寄存器和堆栈指针寄存器) 指令寄存器和堆栈寄存器记录的地址都用于标志拥有线程的进程地址空间中的内存 线程和进程 进程比线程使用更多的系统资源,原因是它需要更多的地址空间。为进程创建一个虚拟地址空间,需要很多系统资源,同时,系统中要保留大量的记录,这也要占用大量的内存。 另外,dll或者exe需要加载到一个地址空间,也需要文件资源。 线程只需要一个内核对象和一个堆栈,保留的记录很少,因此需要很少的内存?? Windows中进程是不活泼的,进程从来不执行任何东西,进程只是线程的容器?? 应该用增加线程来解决编程问题,避免创建新的进程。 Windows线程的调度 抢占式操作系统必须使用某种算法来确定哪些线程应该在何时调度和运行多长时间 Windows被称为抢占式多线程操作系统,因为一个线程可以随时停止运行,然后另外一个线程进行调度。 基于任务优先级的抢占式调度算法,同一优先级的任务遵循时间片轮转,并且遵循FIFO策略。 每隔20ms左右,windows要查看当前所有的线程内核对象,在这些内核对象中,只有某些对象被视为可以调度的对象,Windows选择可调度线程内核对象中的一个,将他加载到CPU寄存器中,然后继续运行,当系统引导时,便可以加载CPU寄存器中的线程上下文,使线程运行。 系统只调度可以调度的线程。实际情况是很多线程是不可调度的线程,比如一个暂停运行的线程(可以在创建线程的时候,直接指定这个线程是暂停的。)比如一个正在等待某些事情发生的线程。 CPU不给无事可作的线程分配CPU时间。 Windows线程的优先级 每个线程都会被赋予一个从0-31的优先级号码 只要是高优先级的线程是可以调度的,系统绝对不会调度低优先级的(Starvation) 系统引导的时候创建特殊的线程——0页线程,其优先级为0,当系统中没有任何其他线程运行时,0页线程负责将系统中所有的空闲RAM页面置0 进程内使用线程相对的优先级:空闲、最低、低于正常、正常、高于正常、最高、关键时间 进程也根据具体情况被分为5个进程优先级类:空闲、低于正常、正常、高于正常、实时 线程的实际优先级是进程优先级类和进程内线程相对优先级的组合 正常优先级类的进程的基本优先级是5, 进程内正常优先级线程的优先级是8,所以一个正常进程中的正常优先级线程的真正优先级是13 3.2 线程的创建 何时创建一个进程的主线程 线程用于描述进程中的运行路径。每当进程被初始化,系统就要创建一个主线程。该线程和C/C++运行库的启动代码一道开始运行,启动代码则调用进入点函数。并且继续运行直到进入点函数返回并且C/C++运行库的启动代码调用ExitProcess为止 线程进入点函数 每个线程必须有一个进入点函数,线程从这个进入点开始运行。 一个进程的主线程的进入点函数 main, wmain, WinMain, wWinMain 一个辅助线程的进入点函数:例如 DWORD WINAPI ThreadFunc(LPVOID pvParam) { DWORD dwResult= 0; ….. return dwResult. } CreateThread函数 在一个已经运行的线程中创建辅助线程 HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes, // 安全性,缺省NULL SIZE_T dwStackSize, // initial

文档评论(0)

rewfdgd + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档