CMultiLock 类

表示多线程程序中用于控制对多个资源的访问的访问控制机制。

语法

class CMultiLock

成员

公共构造函数

名称 描述
CMultiLock::CMultiLock 构造 CMultiLock 对象。

公共方法

名称 描述
CMultiLock::IsLocked 确定数组中的特定同步对象是否锁定。
CMultiLock::Lock 等待同步对象的数组。
CMultiLock::Unlock 释放任何拥有的同步对象。

备注

CMultiLock 没有基类。

若要使用同步类 CSemaphoreCMutexCEvent,可以创建 CMultiLockCSingleLock 对象来等待并释放同步对象。 如果有多个对象可在特定时间使用,则使用 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 极少适用于多锁情况。

另请参阅

层次结构图