CSemaphore 类

CSemaphore 类的对象是同步对象,表示“信号灯”,可允许一个或多个进程中有限数量的线程访问指定资源,并维持当前访问指定资源的线程数量。

语法

class CSemaphore : public CSyncObject

成员

公共构造函数

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

备注

在访问仅支持有限数量用户的共享资源时,可使用信号灯很好地对其进行控制。 CSemaphore 对象的当前计数是允许的其他用户数。 当计数达到零时,就使用 CSemaphore 对象所控制的资源进行的任何尝试都将插入系统队列,并等到超时或计数升至 0 以上。 在构造 CSemaphore 对象期间指定一次可访问受控制资源的最大用户数。

若要使用 CSemaphore 对象,请根据需要构造 CSemaphore 对象。 指定要等待的信号灯的名称,并指定应用程序最初应拥有它。 然后可在构造函数返回时访问信号灯。 完成访问受控资源后,调用 CSyncObject::Unlock

使用 CSemaphore 对象的另一种方法是将 CSemaphore 类型的变量作为数据成员添加到要控制的类。 在构造受控制对象期间,调用 CSemaphore 数据成员的构造函数,指定初始访问计数、最大访问计数、信号灯名称(如果将在不同进程中使用)和所需的安全属性。

若要以这种方式访问 CSemaphore 对象控制的资源,请先在资源的访问成员函数中创建 CSingleLock 类型或 CMultiLock 类型的变量。 然后调用锁对象的 Lock 成员函数(例如 CSingleLock::Lock)。 此时,线程将获取对资源的访问权限,等待资源释放并获取访问权限,或等待资源释放并超时而无法访问资源。 在任何情况下,都是以线程安全的方式访问资源。 若要释放资源,请使用锁对象的 Unlock 成员函数(例如,CSingleLock::Unlock),或允许锁对象脱离范围。

或者,可以创建 CSemaphore 独立对象,并在尝试访问受控资源之前显式访问它。 虽然读取源代码的用户会更容易明白此方法,但它更容易出错。

有关如何使用 CSemaphore 对象的详细信息,请参阅多线程处理:如何使用同步类一文。

继承层次结构

CObject

CSyncObject

CSemaphore

要求

标头:afxmt.h

CSemaphore::CSemaphore

构造命名或未命名 CSemaphore 对象。

CSemaphore(
    LONG lInitialCount = 1,
    LONG lMaxCount = 1,
    LPCTSTR pstrName = NULL,
    LPSECURITY_ATTRIBUTES lpsaAttributes = NULL);

参数

lInitialCount
信号灯的初始使用计数。 必须大于或等于 0 且小于或等于 lMaxCount

lMaxCount
信号灯的最大使用计数。 必须大于 0。

pstrName
信号灯的名称。 如果要在不同进程间访问信号灯,则必须提供该值。 如果为 NULL,该对象未命名。 如果名称与现有信号灯匹配,构造函数将生成新的 CSemaphore 对象,该对象引用使用该名称的信号灯。 如果名称匹配的是非信号灯的现有同步对象,则构造将失败。

lpsaAttributes
信号灯对象的安全属性。 有关此结构的完整说明,请参阅 Windows SDK 中的 SECURITY_ATTRIBUTES

备注

若要访问或释放 CSemaphore 对象,请创建 CMultiLockCSingleLock 对象并调用其 LockUnlock 成员函数。

重要

创建 CSemaphore 对象后,使用 GetLastError 来确保 mutex 尚不存在。 如果 mutex 意外存在,这可能指示流氓进程正在占用 mutex,并可能打算恶意使用它。 在这种情况下,推荐采用有安全意识的做法,即关闭句柄并继续,就像创建对象时发生故障。

另请参阅

CSyncObject 类
层次结构图