CMutex 类

表示一个“mutex”,一个允许一个线程以互相排斥的方式访问一个资源的同步对象。

语法

class CMutex : public CSyncObject

成员

公共构造函数

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

备注

当一次只允许一个线程修改数据或其他一些受控资源时,Mutex 非常有用。 例如,将节点添加到链接列表就是一次只允许一个线程的进程。 通过使用 CMutex 对象来控制链接列表,一次只有一个线程可以访问该列表。

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

使用 CMutex 对象的另一种方法是将 CMutex 类型的变量作为数据成员添加到要控制的类。 在构造受控对象期间,调用 CMutex 数据成员的构造函数,指定 mutex 是否最初拥有、mutex 的名称(如果将跨进程边界使用)和所需的安全属性。

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

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

继承层次结构

CObject

CSyncObject

CMutex

要求

标头:afxmt.h

CMutex::CMutex

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

CMutex(
    BOOL bInitiallyOwn = FALSE,
    LPCTSTR lpszName = NULL,
    LPSECURITY_ATTRIBUTES lpsaAttribute = NULL);

参数

bInitiallyOwn
指定创建 CMutex 对象的线程最初是否有权限访问 mutex 控制的资源。

lpszName
CMutex 对象的名称。 如果存在同名的另一个 mutex,则必须提供 lpszName(如果对象将跨进程边界使用)。 如果为 NULL,则 mutex 将未命名。 如果名称与现有 mutex 匹配,构造函数将生成一个新的 CMutex 对象,该对象引用该名称的 mutex。 如果名称与不是 mutex 的现有同步对象匹配,则构造将失败。

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

备注

若要访问或释放 CMutex 对象,请创建 CMultiLockCSingleLock 对象并调用其 LockUnlock 成员函数。 如果以独立方式使用 CMutex 对象,请调用其 Unlock 成员函数以释放它。

重要

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

另请参阅

CSyncObject 类
层次结构图