CMultiLock类

CMultiLock类没有基类。
CMultiLock类的对象代表多线程程序中控制资源访问的访问控制机制。若为了使用同步类CSemaphore, CMutex, CCriticalSection和CEvent,可以创建CMultiLock或CSingleLock对象以等待或发行同步对象。若在某个特定的时间希望使用多个对象,就请使用CMultiLock。否则,当仅仅在某时需等候某一对象时,请使用CSingleLock。
若要使用CMultiLock 对象,首先要创建希望等待的同步对象的数组。
然后,调用被控制的资源类成员函数内的CMultiLock对象的构造函数。其后调用Lock成员函数来决定资源是否为有效资源(被标记)。若有,就继续进行该成员函数的操作。否则,要么等待一定的时间,等资源被释放,要么返回失败。在资源完全使用后,要么当再一次使用CMultiLock对象调用Unlock函数,要么允许销毁CMultiLock对象。
CMultiLock对象在线程有大量响应的CEvent对象时非常有用。首先创建一个包含所有CEvent指针的数组,然后调用Lock函数。这将导致线程等待到某个事件被标记。
如果要了解有关如何使用CMultiLock对象的更多信息,请参阅联机文档“Visual C++程序员指南”中的“多线程:如何使用同步类”。
#include <afxmt.h>

 

CMultiLock类的成员

构造函数

CMultiLock 构造一个CMultiLock对象

方法
IsLocked 决定数组中指定的同步对象是否被封锁
Lock 等待同步对象数组
Unlock 释放所有的被控制的同步对象

 

CMultiLock::CMultiLock
CMultiLock( CSyncObject* ppObjects[], DWORD dwCount, BOOL bInitialLock = FALSE );
参数:

ppObjects 被等待的同步对象的指针数组。它不能为NULL。
dwCount ppObjects中的对象数。它必须大于0。
bInitialLock 指定是否首次企图进入任何被提供的对象。

构造一个CMultiLock对象。在创建了等候的同步对象数组之后调用该函数。通常在线程必须等某个同步对象有效后调用该函数。
CMultiLock::IsLocked
BOOL IsLocked( DWORD dwObject );
返回值:
如果指定的对象被封锁,则返回非零值,否则为0。
参数:
dwObject 数组中与所要查询状态对象相对应的对象索引。

说明:决定指定的对象是否没做标记(无效)。
CMultiLock::Lock
DWORD Lock( DWORD dwTimeOut = INFINITE, BOOL bWaitForAll = TRUE, DWORD dwWakeMask = 0 );
返回值:若封锁失败,则返回-1,否则返回下列值之一:
· WAIT_OBJECT_0和WAIT_OBJECT_0 + (对象数-1)之间。
若bWaitForAll为TRUE,那么所有对象都被标记(有效)。若bWaitForAll为FALSE,那么返回值——WAIT_OBJECT_0 就是对象数组中被标记(或有效)对象的索引。
· WAIT_OBJECT_0 + (对象的个数)。
在线程输出队列中dwWakeMask 指定的事件有效。
· WAIT_ABANDONED_0和WAIT_ABANDONED_0 + (对象数-1)之间。
若bWaitForAll为TRUE,那么所有的对象都被标记,并且至少某一对象为被遗弃的mutex对象。若bWaitForAll为FALSE,那么返回值——WAIT_ABANDONED_0就是对象数组中满足等待条件的被遗弃的mutex对象的索引。
· WAIT_TIMEOUT
等待失败,超过dwTimeOut指定的时间。

参数:
dwTimeOut 指定等待同步对象有效(被标记)的时间。若该值为INFINITE,那么Lock函数在返回前一直等到对象被标记。
bWaitForAll 指定返回前是否正在等待的所有对象都必须同时被标记。若该值为FALSE,那么Lock函数将返回任一被标记的被等待的对象。
dwWakeMask 指定允许中断等待的其它条件。如果需要该参数有效选择项的完整列表,请参阅“Win32程序员参考”中的MsgWaitForMultipleObjects。

说明:
调用该函数获取由提供给CMultiLock构造函数同步对象控制的一个或多个资源的访问。若bWaitForAll为TRUE,那么一旦所有的同步对象同时被标记,则Lock函数将成功返回。否则若bWaitForAll为FALSE,那么一旦一个或多个同步对象被标记,则Lock函数将返回。
若Lock函数不能立即返回,那么在返回前,它等待的时间将不会超过参数dwTimeOut指定的毫秒数。若dwTimeOut为INFINITE,那么直到访问了要获取的对象或遇到了dwWakeMask指定的条件,Lock函数才返回。否则,若Lock函数能够获取一个同步对象,那么它将成功返回。否则,它将返回失败。
CMultiLock::Unlock
BOOL Unlock( );
BOOL Unlock( LONG lCount, LPLONG lPrevCount = NULL );
返回值:如果成功,则返回非零值,否则为0。
参数:
lCount 要释放的参考合计数。该值必须大于0。若指定的总数导致对象数超过其最大值,那么该对象数将不做修改,函数将返回FALSE。
lPrevCount 指向接收同步对象以前数目的变量。若为NULL,则不返回以前的数目。

说明:
释放由CMultiLock拥有的同步对象。通过CMultiLock的构造函数调用该函数。
第一种格式的Unlock试图解锁由CmultiLock控制的同步对象。而第二种格式的Unlock试图解锁由CMultiLock拥有的CSemaphore对象。若CMultiLock没有拥有任何的CSemaphore 对象,那么函数将返回FALSE;否则将返回TRUE。lCount和lpPrevCount恰恰与CSingleLock::Unlock的参数相同。第二种格式的Unlock很少应用于多锁的情况。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值