友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!阅读过程发现任何错误请告诉我们,谢谢!! 报告错误
狗狗书籍 返回本书目录 我的书架 我的书签 TXT全本下载 进入书吧 加入书签

VC语言6.0程序设计从入门到精通-第90章

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!




     );  



     函数中主要参数的意义如下。  



 ·236 ·  


…………………………………………………………Page 248……………………………………………………………

                                                                               第 9 章    多线程  



     o  lpCriticalSection :指向临界区对象的指针。  



     (4 )LeaveCriticalSection  

     Win32 API 函数 LeaveCriticalSection 用来释放临界区的所有权,它的函数原型如下:  



     VOID LeaveCriticalSection(  



         LPCRITICAL_SECTION lpCriticalSection        



     );    



     函数中主要参数的意义如下。  

     o  lpCriticalSection :指向临界区对象的指针。  

     当速度要求较高,并且进程边界的资源不会被交叉使用的时候,通常采用 Critical Section 

替代  Mutexes 。临界区不是一个核心对象,无法获知进入临界区的线程的状态,如果进入临 

界区的线程处于死锁状态,没有释放临界资源,系统无法获知,而且没有办法释放该临界资 

源。这个缺点在互斥器(Mutex )中得到了弥补。  



     (5 )CCriticalSection  

     CcriticalSection 是临界区在 MFC 中的相应的类。它的成员函数如表 9…5 所示。  



     表 9…5                           CEvent 类的成员函数  



                     函数名称                                             作用  

 CCriticalSection                                   构造函数,构造 CCriticalSection 对象  

 Lock                                              进入临界区  

 UnLock                                             离开临界区  



     3 .事件(Event )  



     事件(Event )是由 Windows 操作系统管理的同步对象。可以用于进程或线程的同步。一 

个事件被创建后,只有激发状态和未激发状态两种状态,也称为发信号状态和未发信号状态。 

                                                                                               

     事件包括手动重置事件和自动重置事件两种类型。手动重置事件被设置为激发状态后, 

会唤醒所有等待的线程,而且一直保持激发状态,直到程序重新把它设置为未激发状态。自 

动重置事件被设置为激发状态后,会唤醒一个等待中的线程,然后自动恢复为未激发状态。 

所以用自动重置事件来同步两个线程比较理想。  



     (1)CreateEvent  

     通过调用 Win32API 函数 CreateEvent 来创建或者打开一个事件对象 。如果调用成功,返 

回事件对象的句柄,否则返回空。它的函数原型如下:  



     HANDLE CreateEvent(  



         LPSECURITY_ATTRIBUTES lpEventAttributes;    



         BOOL bManualReset;                                                



         BOOL bInitialState;                                              



         LPCTSTR lpName                                                      



     );  



     函数中主要参数的意义如下。  

     o  lpEventAttributes :指向 SECURITY_ATTRIBUTES 结构的指针,它决定返回的句柄是 

       否可以被子进程继承。如果 lpEventAttributes 为空,则不能被继承。  



                                                                                       ·237 ·  


…………………………………………………………Page 249……………………………………………………………

Visual C++ 6。0 程序设计从入门到精通  



     o  bManualReset :指定创建一个手动重置事件或自动重置事件。如果为前者,必须调用 

        ResetEvent 手动设定状态为非激活状态。否则,当一个等待线程被释放后,系统会自 

        动设定对象的状态为非激活状态。  

     o  bInitialState :指定对象的初始状态。  

     o  lpName :事件对象的名称。  



     (2 )OpenEvent  

     函数 OpenEvent 可以打开一个存在的事件对象,允许多个进程打开同一个对象。如果调 

用成功,返回事件对象的句柄。否则返回空。它的函数原型如下:  



     HANDLE OpenEvent(  



         DWORD dwDesiredAccess;      



         BOOL bInheritHandle;          



         LPCTSTR lpName                      



     );  



     函数中主要参数的意义如下。  

     o  dwDesiredAccess :指定如何操作对象。  

     o  bInheritHandle :指定返回的句柄是否可以被继承。  

     o  lpName :事件对象的名称。  



     (3 )SetEvent,ResetEvent 和 PulseEvent  

     如果需要修改事件句柄的状态,可以使用  SetEvent、ResetEvent  和  PulseEvent 。其中, 

SetEvent 将事件句柄的状态改为激活状态,如果自动重置事件处于激活状态,在满足了等待 

线程后,它可以被重置 。手动重置事件必须调用 ResetEvent 函数将事件对象重置为激活状态。 

PulseEvent   函数用来向事件句柄发信号,并在所有的等待线程都被释放后,将事件句柄重置 

为未激活状态。它们的返回值相同,如果调用成功,返回非 0 值,否则返回 0 。它们的函数 

原型如下:  



     BOOL SetEvent(  



         HANDLE hEvent      



     );  



     BOOL ResetEvent(  



         HANDLE hEvent      



     );  



     BOOL PulseEvent(  



         HANDLE hEvent      



     );  



     函数中主要参数的意义如下。  

     o  hEvent :事件对象的句柄。  

     如果不再使用句柄,可以调用 Win32API 函数 CloseHandle 关闭句柄。函数原型如下:  



     BOOL CloseHandle(  



         HANDLE hObject      



     );  



 ·238 ·  


…………………………………………………………Page 250……………………………………………………………

                                                                  第 9 章    多线程  



    函数中主要参数的意义如下。  

    o  hObject :对象的句柄。  



    (4 )CEvent  

    事件(Event )在 MFC 中的相应的类是 CEvent 。CEvent 的构造函数默认创建一个自动重 

置的事件,而且处于未激发状态。它的成员函数及其作用如表 9…6 所示。  



    表 9…6                      CEvent 类的成员函数  



                  函数名称                                    作用  

 CEvent                                    构造函数,构造 CEvent 对象  

 SetEvent                                  启动事件对象,释放等待线程  

 PulseEvent                                启动事件对象,释放等待线程,或者重置事件 

                                           对象为未激活状态  

 ResetEvent                                设置事件对象为未激活状态  

 Unlock                                    释放事件对象  



    4 .互斥器(Mutex )  



    互斥器的功能与临界区相似。区别在于互斥器所花费的时间比临界区多很多,但是互斥 

器是核心对象(后面介绍的 Event 和 Semaphore 也是核心对象),可以跨进程使用,而且等待 

一个被锁住的互斥器可以设定  TIMEOUT,不会像临界区那样无法得知临界区的情况,一直 

等待。  

    Win32 �
返回目录 上一页 下一页 回到顶部 赞(1) 踩(1)
未阅读完?加入书签已便下次继续阅读!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!