CMultiLock 类
表示多线程程序中用于控制对多个资源的访问的访问控制机制。
语法
class CMultiLock
成员
公共构造函数
名称 | 描述 |
---|---|
CMultiLock::CMultiLock | 构造 CMultiLock 对象。 |
公共方法
名称 | 描述 |
---|---|
CMultiLock::IsLocked | 确定数组中的特定同步对象是否锁定。 |
CMultiLock::Lock | 等待同步对象的数组。 |
CMultiLock::Unlock | 释放任何拥有的同步对象。 |
备注
CMultiLock
没有基类。
若要使用同步类 CSemaphore、CMutex 和 CEvent,可以创建 CMultiLock
或 CSingleLock 对象来等待并释放同步对象。 如果有多个对象可在特定时间使用,则使用 CMultiLock
。 如果一次只需等待一个对象,则使用 CSingleLock
。
若要使用 CMultiLock
对象,请先创建要等待的同步对象的数组。 接下来在受控资源的类中成员函数内部调用 CMultiLock
对象的构造函数。 然后调用 Lock 成员函数以确定资源是否可用(有信号)。 如果有资源可用,请继续执行成员函数的其余部分。 如果没有资源可用,请等待指定的时间以便系统释放资源,或返回失败。 不再需要使用资源后,如果要再次使用 CMultiLock
对象,则调用 Unlock 函数,否则允许销毁 CMultiLock
对象。
当线程具有大量它可以响应的 CEvent
对象时,CMultiLock
对象最有用。 创建包含所有 CEvent
指针的数组,并调用 Lock
。 这将导致线程一直等到其中一个事件有信号。
有关如何使用 CMultiLock
对象的详细信息,请参阅多线程处理:如何使用同步类一文。
继承层次结构
CMultiLock
要求
标头:afxmt.h
CMultiLock::CMultiLock
构造 CMultiLock
对象。
CMultiLock(
CSyncObject* ppObjects [ ],
DWORD dwCount,
BOOL bInitialLock = FALSE);
参数
ppObjects
指向要等待的同步对象的指针数组。 不能为 NULL。
dwCount
ppObjects 中的对象数。 必须大于 0。
bInitialLock
指定是否最初尝试访问提供的任何对象。
注解
创建要等待的同步对象的数组后,调用此函数。 它通常从必须等待其中一个同步对象可用的线程内部进行调用。
CMultiLock::IsLocked
确定指定的对象是否无信号(不可用)。
BOOL IsLocked(DWORD dwItem);
参数
dwItem
与要查询其状态的对象对应的对象数组中的索引。
返回值
如果指定的对象锁定,则为非零;否则为 0。
CMultiLock::Lock
调用此函数以获取对同步对象(提供给 CMultiLock
构造函数)控制的一个或多个资源的访问权限。
DWORD Lock(
DWORD dwTimeOut = INFINITE,
BOOL bWaitForAll = TRUE,
DWORD dwWakeMask = 0);
参数
dwTimeOut
指定等待同步对象可用(“有信号”)的时间量。 如果为 INFINITE,Lock
将一直等到该对象有信号,然后才会返回。
bWaitForAll
指定在返回之前等待的所有对象是否必须同时变为有信号。 如果为 FALSE,当任一等待的对象有信号时,Lock
将返回。
dwWakeMask
指定允许中止等待的其他条件。 有关此参数可用选项的完整列表,请参阅 Windows SDK 中的 MsgWaitForMultipleObjects。
返回值
如果 Lock
失败,则返回 - 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,则所有对象有信号,并且至少有一个对象是放弃的互斥对象。 如果 bWaitForAll 为 FALSE,则返回值 WAIT_ABANDONED_0 是满足等待的已放弃互斥对象数组中的索引。
WAIT_TIMEOUT
dwTimeOut 中指定的超时间隔在等待还未成功的情况下已过期。
注解
如果 bWaitForAll 为 TRUE,则只要所有同步对象同时变为有信号,Lock
就会成功返回。 如果 bWaitForAll 为 FALSE,当一个或多个同步对象变为有信号时 Lock
立即返回。
如果 Lock
无法立即返回,它将最多等待 dwTimeOut 参数中指定的毫秒数,之后便返回。 如果 dwTimeOut 为 INFINITE,Lock
将等到获取对象访问权限或满足 dwWakeMask 中指定的条件后再返回。 否则,如果 Lock
能够获取同步对象,它将成功返回;如果不能,将返回失败。
CMultiLock::Unlock
释放由 CMultiLock
拥有的同步对象。
BOOL Unlock();
BOOL Unlock(
LONG lCount,
LPLONG lPrevCount = NULL);
参数
lCount
要释放的引用数。 必须大于 0。 如果指定量将导致对象数超过其最大值,则不会更改计数,并且函数返回 FALSE。
lPrevCount
指向变量以接收同步对象的上一个计数。 如果为 NULL,则不返回上一个计数。
返回值
如果该函数成功,则为非零;否则为 0。
备注
此函数由 CMultiLock
析构函数调用。
第一种 Unlock
尝试解锁由 CMultiLock
管理的同步对象。 第二种 Unlock
尝试解锁由 CMultiLock
拥有的 CSemaphore
对象。 如果 CMultiLock
没有任何锁定的 CSemaphore
对象,该函数返回 FALSE;否则返回 TRUE。 lCount 和 lpPrevCount 与 CSingleLock::Unlock 的参数完全相同。 第二种 Unlock
极少适用于多锁情况。