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对象并调用其和Lock解锁成员函数。

重要

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

另请参阅

CSyncObject
层次结构图