C++课件_第16章_多任务及多线程编程.ppt

  1. 1、本文档共86页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第16章 多任务与多线程编程 本章主要教学内容 进程与线程 线程的种类与MFC同步类 线程的使用 线程的同步及常用的同步对象 第16章 多任务与多线程编程 16.1 程序、进程和线程概述 16.2 线程的种类 16.3 线程的创建、启动和终止 16.4 线程的操作和管理 16.5 在VC++环境中使用同步对象 16.6 本章小结 16.7 思考与练习 16.1 程序、进程和线程概述 16.1.1 多任务、进程和线程 16.1.1 多任务、进程和线程 16.1.1 多任务、进程和线程 16.1.1 多任务、进程和线程 16.2 线程的种类 16.16.1 MFC中的线程类 16.16.2 用户界面线程(UI) 16.16.3 工作者线程 16.3 线程的创建、启动和终止 16.3.1 线程的创建 16.3.2 线程的启动 16.3.3 线程的终止 16.4 线程的操作和管理 16.4.1 线程的运行状态的设置 16.4.1 线程的运行状态的设置 16.4.2 线程的优先级 16.4.3 线程间的通信 16.5 在VC++环境中使用同步对象 16.5.1 事件对象 16.5.2 临界区 16.5.4 信号灯 16.6 本章小结 线程与进程的基本概念 与线程相关的一些概念和函数 用于线程同步的对象以及MFC中的四个较为常用的线程同步类 当在线程的执行函数中调用该函数时,线程暂时挂起,系统监视hHandle所指向的对象的状态。如果经过dwMilliseconds毫秒后,hHandle指向的对象变为有信号状态,则WaitForSingleObject()返回,线程被释放,且返回值为WAIT_TIMEOUT;如果在挂起的dwMilliseconds毫秒内,线程所等待的对象在某一时刻变为有信号,则该函数立即返回,返回值为WAIT_OBJECT_0。 16.5.1 事件对象 参数dwMilliseconds有两个具有特殊意义的值:0和INFINITE。若为0,则该函数立即返回;若为INFINITE,则线程一直被挂起,直到hHandle所指向的对象变为有信号状态时为止。 16.5.1 事件对象 CEvent::ResetEvent( )把对象设置为无信号状态,程序在WaitForSingleObject(hHandle,INFINITE)处等待。 CEvent::SetEvent( )把对象设置为有信号状态,释放等待的线程。 如果CEvent对象为自动事件,则当WaitForSingleObject(hHandle,INFINITE)返回时,自动把CEvent对象重置为无信号状态。 16.5.1 事件对象 总结以上,几个函数的使用顺序为: B线程在执行到CEvent类成员函数Lock( )时将会发生阻塞,而A线程此时则可以在没有B线程干扰的情况下对共享资源进行处理,并在处理完成后通过成员函数SetEvent( )向B发出事件,使其被释放,得以对A先前已处理完毕的共享资源进行操作。 16.5.1 事件对象 另外通过一个例题来演示事件的工作原理: 临界区(Critical Section)是一段代码,该代码独占对某些共享资源的访问,在任意时刻只允许一个线程对共享资源进行访问。如果有多个线程试图同时访问临界区,那么在有一个线程进入后其他所有试图访问此临界区的线程将被挂起,并一直持续到进入临界区的线程离开。 临界区在被释放后,其他线程可以继续抢占,并以此达到用原子方式操作共享资源的目的。 16.5.2 临界区 在使用临界区时,一般不允许其运行时间过长,只要进入临界区的线程还没有离开,其他所有试图进入此临界区的线程都会被挂起而进入到等待状态,并会在一定程度上影响。程序的运行性能。尤其需要注意的是不要将等待用户输入或是其他一些外界干预的操作包含到临界区。如果进入了临界区却一直没有释放,同样也会引起其他线程的长时间等待。 16.5.2 临界区 虽然临界区同步速度很快,但却只能用来同步本进程内的线程,而不可用来同步多个进程中的线程。 MFC为临界区提供有一个CCriticalSection类,使用该类进行线程同步处理是非常简单的,只需在线程函数中用CCriticalSection类成员函数Lock()和UnLock()标定出被保护的代码片段即可。 16.5.2 临界区 下面通过一段代码展示了临界区在保护多线程访问的共享资源中的作用。通过两个线程来分别对全局变量g_cArray[10]进行写入操作,用临界区对象g_clsCriticalSection来保持线程的同步,并在开启线程前对其进行初始化。为了使实验效果更加明显,体现出临界区的作用,在线程函数对共享资源g_cArray[

文档评论(0)

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

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

1亿VIP精品文档

相关文档