- 1、本文档共84页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
C++课件多任务与多线程编程.ppt
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 事件对象 另外通过一个例题来演示事件的工作原理: 16.5.2 临界区 临界区(Critical Section)是一段代码,该代码独占对某些共享资源的访问,在任意时刻只允许一个线程对共享资源进行访问。如果有多个线程试图同时访问临界区,那么在有一个线程进入后其他所有试图访问此临界区的线程将被挂起,并一直持续到进入临界区的线程离开。 临界区在被释放后,其他线程可以继续抢占,并以此达到用原子方式操作共享资源的目的。 16.5.2 临界区 在使用临界区时,一般不允许其运行时间过长,只要进入临界区的线程还没有离开,其他所有试图进入此临界区的线程都会被挂起而进入到等待状态,并会在一定程度上影响。程序的运行性能。尤其需要注意的是不要将等待用户输入或是其他一些外界干预的操作包含到临界区。如果进入了临界区却一直没有释放,同样也会引起其他线程的长时间等待。 16.5.2 临界区 虽然临界区同步速度很快,但却只能用来同步本进程内的线程,而不可用来同步多个进程中的线程。 MFC为临界区提供有一个CCriticalSection类,使用该类进行线程同步处理是非常简单的,只需在线程函数中用CCriticalSection类成员函数Lock()和UnLock()标定出被保护的代码片段即可。 16.5.2 临界区 下面通过一段代码展示了临界区在保护多线程访问的共享资源中的作用。通过两个线程来分别对全局变量g_cArray[10]进行写入操作,用临界区对象g_clsCriticalSection来保持线程的同步,并在开启线程前对其进行初始化。为了使实验效果更加明显,体现出临界区的作用,在线程函数对共享资源g_cArray[10]的写入时,以Sleep( )函数延迟1毫秒,使其他线程同其抢占CPU的可能性增大。如果不使用临界区对其进行保护,则共享资源数据将被破坏。而使用临界区对线程保持同步后则可以得到正确的结果。 16.5.3 互斥量 互斥量(Mutex)是一种用途非常广泛的内核对象。能够保证多个线程对同一共享资源的互斥访问。同临界区有些类似,只有拥有互斥对象的线程才具有访问资源的权限,由于互斥对象只有一个,因此就决定了任何情况下此共享资源都不会同时被多个线程所访问。当前占有资源的线程在任务处理完后应将拥有的互斥对象交出,以便其他线程在获得后得以访问共享资源。 图:互斥内核对象的工作模型 16.5.3 互斥量 与其他几种内核对象不同,互斥对象在操作系统中拥有特殊代码,并由操作系统来管理,操作系统甚至还允许其进行一些其他内核对象所不能进行的非常规操作。为便于理解,可参照下图。 共享资源 拥有互斥量的线程 16.5.3 互斥量 互斥对象在MFC中通过CMutex类进行表述。使用CMutex类的方法非常简单,在构造CMutex类对象的同时可以指明待查询的互斥对象的名字,在构造函数返回后即可访问此互斥变量。CMutex类也是只含有构造函数这唯一的成员函数,当完成对互斥对象保护资源的访问后,可通过调用从父类CSyncObject继承的UnLock()函数完成对互斥对象的释放。 16.5.3 互斥量 CMutex类构造函数原型为: 其参数说明如下: CMutex( BOOL bInitiallyOwn = FALSE, LPCTSTR lpszName = NULL, LPSECURITY_ATTRIBUTE SlpsaAttribute = NULL ) 16.5.3 互斥量 bInitiallyOwn: 该参数指定是否创建了CMutex对象的线程最初拥有由互斥量CMutex控制的共享资源的控制权。 16.5.3 互斥量 lpszName: 指定要创建的CMutex对象的名字。若该值为NULL,则生成CMutex对象没有命名。
文档评论(0)