createMutexExW 函数 (synchapi.h)

创建或打开一个命名或未命名的互斥对象,并返回该对象的句柄。

语法

HANDLE CreateMutexExW(
  [in, optional] LPSECURITY_ATTRIBUTES lpMutexAttributes,
  [in, optional] LPCWSTR               lpName,
  [in]           DWORD                 dwFlags,
  [in]           DWORD                 dwDesiredAccess
);

参数

[in, optional] lpMutexAttributes

指向 SECURITY_ATTRIBUTES 结构的指针。 如果此参数为 NULL,则互斥句柄不能由子进程继承。

结构的 lpSecurityDescriptor 成员为新的互斥体指定安全描述符。 如果 lpMutexAttributesNULL,则互斥体将获取默认安全描述符。 互斥体的默认安全描述符中的 ACL 来自创建者的主要令牌或模拟令牌。 有关详细信息,请参阅 Synchronization Object Security and Access Rights

[in, optional] lpName

互斥对象的名称。 名称限制为 MAX_PATH 个字符。 名称比较区分大小写。

如果 lpNameNULL,则创建互斥对象时不带名称。

如果 lpName 与现有事件、信号灯、可等待计时器、作业或文件映射对象的名称匹配,则函数将失败, GetLastError 函数返回 ERROR_INVALID_HANDLE。 发生这种情况是因为这些对象共享相同的命名空间。

名称可以具有“Global”或“Local”前缀,以在全局命名空间或会话命名空间中显式创建对象。 名称的其余部分可以包含除反斜杠字符 (\) 以外的任何字符。 有关详细信息,请参阅 内核对象命名空间。 快速用户切换是使用终端服务会话实现的。 内核对象名称必须遵循终端服务概述的准则,以便应用程序可以支持多个用户。

可以在专用命名空间中创建 对象。 有关详细信息,请参阅 对象命名空间

[in] dwFlags

此参数可以是 0 或以下值。

含义
CREATE_MUTEX_INITIAL_OWNER
0x00000001
对象创建者是互斥体的初始所有者。

[in] dwDesiredAccess

互斥对象的访问掩码。 有关访问权限的列表,请参阅 Synchronization Object Security and Access Rights

返回值

如果函数成功,则返回值是新创建的互斥对象的句柄。

如果函数失败,则返回值为 NULL。 要获得更多的错误信息,请调用 GetLastError。

如果互斥体是命名互斥体,并且对象在此函数调用之前存在,则返回值是现有对象的句柄, 并且 GetLastError 函数返回 ERROR_ALREADY_EXISTS

注解

如果使用命名互斥体将应用程序限制为单个实例,则恶意用户可以在你执行此操作之前创建此互斥体,并阻止应用程序启动。 若要防止出现这种情况,请创建一个随机命名的互斥体并存储该名称,以便只能由授权用户获取该名称。 或者,可以使用文件实现此目的。 若要将应用程序限制为每个用户一个实例,请在用户的配置文件目录中创建一个锁定的文件。

调用进程的任何线程都可以在调用某个 等待函数时指定互斥对象句柄。 当指定对象的状态被发出信号时,单对象等待函数将返回。 当任何一个或所有指定对象都收到信号时,可以指示多对象等待函数返回。 当等待函数返回时,将释放等待线程以继续执行。

当互斥对象不归任何线程所有时,将对其状态发出信号。 创建线程可以使用 dwFlags 参数请求互斥体的即时所有权。 否则,线程必须使用等待函数之一来请求所有权。 当向互斥体的状态发出信号时,向一个等待线程授予所有权,互斥体的状态将更改为未签名,等待函数将返回。 在任何给定时间,只有一个线程可以拥有互斥体。 拥有线程使用 ReleaseMutex 函数释放其所有权。

拥有互斥体的线程可以在重复的等待函数调用中指定相同的互斥体,而不会阻止其执行。 通常,你不会重复等待相同的互斥体,但此机制可防止线程在等待它已拥有的互斥体时自行死锁。 但是,若要释放其所有权,每次互斥体满足等待时,线程都必须调用 ReleaseMutex 一次。

两个或更多进程可以调用 CreateMutex 来创建同一个命名互斥体。 第一个进程实际上创建互斥体,具有足够访问权限的后续进程只需打开对现有互斥体的句柄。 这使多个进程能够获取同一互斥锁的句柄,同时减轻用户确保首先启动创建过程的责任。 使用此方法时,不应使用 CREATE_MUTEX_INITIAL_OWNER 标志;否则,可能很难确定哪个进程具有初始所有权。

多个进程可以具有同一互斥对象的句柄,从而允许使用该对象进行进程间同步。 可以使用以下对象共享机制:

  • 如果 CreateMutex 的 lpMutexAttributes参数启用了继承,则 CreateProcess 函数创建的子进程可以继承互斥对象的句柄。 此机制适用于命名和未命名的互斥体。
  • 进程可以在调用 DuplicateHandle 函数时指定互斥对象的句柄,以创建另一个进程可以使用的重复句柄。 此机制适用于命名和未命名的互斥体。
  • 进程可以在调用 [OpenMutex] (./nf-synchapi-openmutexw.md) 或 CreateMutex 函数中指定命名互斥体,以检索互斥对象的句柄。
使用 CloseHandle 函数关闭句柄。 进程终止时,系统会自动关闭句柄。 互斥对象在其最后一个句柄已关闭时被销毁。

注意

synchapi.h 标头将 CreateMutexEx 定义为别名,该别名根据 UNICODE 预处理器常量的定义自动选择此函数的 ANSI 或 Unicode 版本。 将非特定编码别名与非非特定编码的代码混合使用可能会导致不匹配,从而导致编译或运行时错误。 有关详细信息,请参阅 函数原型的约定

要求

要求
最低受支持的客户端 Windows Vista [桌面应用 | UWP 应用]
最低受支持的服务器 Windows Server 2008 [桌面应用 | UWP 应用]
目标平台 Windows
标头 synchapi.h (包括 Windows 7 上的 Windows.h、Windows Server 2008 Windows Server 2008 R2)
Library Kernel32.lib
DLL Kernel32.dll

另请参阅

CloseHandle

互斥对象

同步函数