第8章 Windows多线程应用程序及其应用.ppt_第1页
第8章 Windows多线程应用程序及其应用.ppt_第2页
第8章 Windows多线程应用程序及其应用.ppt_第3页
第8章 Windows多线程应用程序及其应用.ppt_第4页
第8章 Windows多线程应用程序及其应用.ppt_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

2010年10月 重庆理工大学计算机科学与工程学院计算机科学与技术系刘恒洋 共 页第1页 第8章Windows多线程应用程序及其应用 重点 1 多任务 进程 线程 2 线程同步 线程通信 3 示例系统中多线程类的设计 2010年10月 重庆理工大学计算机科学与工程学院计算机科学与技术系刘恒洋 共 页第2页 8 1进程和线程 8 1 1进程与线程 多任务是指系统可以同时运行多个进程 而每个进程也可以同时执行多个线程 进程是应用程序的运行实例 每个进程都有自己私有的虚拟地址空间 每个进程都有一个主线程 但可以建立另外的线程 进程中的线程是并发执行的 每个线程占用CPU的时间由系统来划分 线程是操作系统分配CPU时间的基本实体 进程中的所有线程共享进程的虚拟地址空间 这意味着所有线程都可以访问进程的全局变量和资源 2010年10月 重庆理工大学计算机科学与工程学院计算机科学与技术系刘恒洋 共 页第3页 8 1 2线程的创建和终止 线程分用户界面线程和工作者线程两种 用户界面线程拥有自己的消息泵来处理界面消息 可以与用户进行交互 工作者线程没有消息泵 一般用来完成后台工作 利用全局函数AfxBeginThread可以创建工作者线程和用户界面线程 CWinThread AfxBeginThread AFX THREADPROCpfnThreadProc LPVOIDpParam intnPriority THREAD PRIORITY NORMAL UINTnStackSize 0 DWORDdwCreateFlags 0 LPSECURITY ATTRIBUTESlpSecurityAttrs NULL 创建工作者线程CWinThread AfxBeginThread CRuntimeClass pThreadClass intnPriority THREAD PRIORITY NORMAL UINTnStackSize 0 DWORDdwCreateFlags 0 LPSECURITY ATTRIBUTESlpSecurityAttrs NULL 创建用户界面线程 当发生下列事件之一时 线程被终止 线程调用ExitThread 线程函数返回 即线程隐式调用了ExitThread ExitProcess被进程的任一线程显式或隐式调用 用线程的句柄调用TerminateThread 用进程句柄调用TerminateProcess 2010年10月 重庆理工大学计算机科学与工程学院计算机科学与技术系刘恒洋 共 页第4页 8 2 1为什么需要同步 8 2线程同步 同一进程的所有线程共享进程的虚拟地址空间 所以可能会发生两个线程同时访问同一对象 包括全局变量 共享资源 API函数和MFC对象等 的情况 这有可能导致程序错误 需要线程同步的情况包括以下几种 在多个线程同时访问同一对象时 MFC对象在对象级不是线程安全的 只有在类级才是 也就是说 两个线程可以安全地使用两个不同的CString对象 但同时使用同一个CString对象可能产生问题 多个线程之间需要协调运行MFC中可以用来控制线程同步的四个类为 事件 临界段 互斥体和信号计数器 2010年10月 重庆理工大学计算机科学与工程学院计算机科学与技术系刘恒洋 共 页第5页 8 2 2事件对象 事件对象就像一个标志 这个标志有两个状态 true和false 当该标志为True 发信 时 就允许系统启动运行正在等待的线程 而当标志为False 未发信 时 则禁止系统启动运行那些线程 CEvent BOOLbInitiallyOwn FALSE BOOLbManualReset FALSE LPCTSTRlpszName NULL LPSECURITY ATTRIBUTESlpsaAttribute NULL 参见例题TestForCEvent 1 自动事件对象的使用 2 手工事件对象的使用 2010年10月 重庆理工大学计算机科学与工程学院计算机科学与技术系刘恒洋 共 页第6页 8 2 3临界段 类CCriticalSection的对象叫做临界段 它就像一把钥匙 哪个线程获得了它 就获得了运行线程的权利 而将其他线程全部阻塞 CCriticalSectioncriticalSectionObj 如果一个线程希望获得临界段 则要使用临界段对象的成员函数Lock 线程在调用这个函数时会出现两种结果 当没有其他线程锁定这个临界段对象时 调用Lock函数的线程将获得临界段对象 获得了继续运行线程的权利 若有其他线程锁定这个临界段对象且没有释放它时 线程将被阻塞 当线程再不需要临界段对象时 要用临界段对象的成员函数UnLock交出临界段对象 以便其他线程使用它 参见例题TestForCCriticalSection 8 2 4互斥体 互斥体是CMutex类的对象 跟临界段不同的是 临界段对象只能在同一个进程中对线程进行同步 而互斥体对象可以在不同的进程间进行线程同步控制 参见例题TestForCMutex CMutex BOOLbInitiallyOwn FALSE LPCTSTRlpszName NULL LPSECURITY ATTRIBUTESlpsaAttribute NULL 2010年10月 重庆理工大学计算机科学与工程学院计算机科学与技术系刘恒洋 共 页第7页 8 2 5信号计数器 信号计数器是CSemaphore的对象 该对象的作用是对访问某个共享资源的线程的数目进行限制 CSemaphore LONGlInitialCount 1 LONGlMaxCount 1 LPCTSTRpstrName NULL LPSECURITY ATTRIBUTESlpsaAttributes NULL 信号计数器对象有一个可以设置初值的计数器 每当一个线程使用资源时 在该线程中就调用成员函数Lock将该计数器的值减1 当计数值为0时 就不再允许其他的线程访问该资源 当一个线程使用信号计数器对象的成员函数Unlock释放资源时 可以将计数器的值加1 信号计数器对象允许多个线程访问同一个资源 但同时访问该资源的线程总数不能超过信号计数器对象的最大计数值 参见例题TestForCSemaphore 2010年10月 重庆理工大学计算机科学与工程学院计算机科学与技术系刘恒洋 共 页第8页 8 3 1利用全局变量进行通信 8 3线程通信 在多个函数之间进行消息传递 除了通过参数传递外还可以通过全局变量的方式来实现 这种方法在多线程之间的通信同样适用 参见例题TestForGlobalCom 8 3 2利用自定义消息进行通信 可以通过自定义的消息来实现线程之间的通信 SendMessage函数和PostMessage函数用来发送自定义消息 SendMessage 必须等待其他线程处理消息后才返回 然后继续执行

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论