类 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
对象的详细信息,请参阅多线程处理:如何使用同步类一文。
继承层次结构
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
对象,请创建或CMultiLock
CSingleLock
对象并调用其和Lock
解锁成员函数。
重要
创建 CSemaphore
对象后,用于 GetLastError
确保互斥体尚不存在。 如果 mutex 意外存在,这可能指示流氓进程正在占用 mutex,并可能打算恶意使用它。 在这种情况下,推荐采用有安全意识的做法,即关闭句柄并继续,就像创建对象时发生故障。