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


);
函数中主要参数的意义如下。
·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 ?
小说推荐
返回首页返回目录