CreateSemaphoreW 函数 (synchapi.h)
创建或打开一个命名或未命名的信号灯对象。
若要指定对象的访问掩码,请使用 CreateSemaphoreEx 函数。
语法
HANDLE CreateSemaphoreW(
[in, optional] LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,
[in] LONG lInitialCount,
[in] LONG lMaximumCount,
[in, optional] LPCWSTR lpName
);
参数
[in, optional] lpSemaphoreAttributes
指向 SECURITY_ATTRIBUTES 结构的指针。 如果此参数为 NULL,则子进程无法继承句柄。
结构的 lpSecurityDescriptor 成员指定新信号灯的安全描述符。 如果此参数为 NULL,则信号灯将获取默认的安全描述符。 信号灯的默认安全描述符中的 ACL 来自创建者的主要令牌或模拟令牌。
[in] lInitialCount
信号灯对象的初始计数。 此值必须大于或等于零且小于或等于 lMaximumCount。 信号灯的状态在计数大于零时发出信号,当信号灯为零时将发出信号灯状态。 每当等待函数释放正在等待信号灯的线程时,计数将减少 1。 通过调用 ReleaseSemaphore 函数,计数按指定数量增加。
[in] lMaximumCount
信号灯对象的最大计数。 此值必须大于零。
[in, optional] lpName
信号灯对象的名称。 名称限制为 MAX_PATH 个字符。 名称比较区分大小写。
如果 lpName 与现有命名信号灯对象的名称匹配,则此函数请求 SEMAPHORE_ALL_ACCESS 访问权限。 在这种情况下, lInitialCount 和 lMaximumCount 参数将被忽略,因为它们已由创建过程设置。 如果 lpSemaphoreAttributes 参数不为 NULL,它将确定是否可以继承句柄,但忽略其安全描述符成员。
如果 lpName 为 NULL,则创建信号灯对象时不带名称。
如果 lpName 与现有事件、互斥体、可等待计时器、作业或文件映射对象的名称匹配,则函数将失败, GetLastError 函数将返回 ERROR_INVALID_HANDLE。 发生这种情况是因为这些对象共享相同的命名空间。
名称可以具有“Global”或“Local”前缀,以在全局命名空间或会话命名空间中显式创建对象。 名称的其余部分可以包含除反斜杠字符 (\) 以外的任何字符。 有关详细信息,请参阅 内核对象命名空间。 快速用户切换是使用终端服务会话实现的。 内核对象名称必须遵循终端服务概述的准则,以便应用程序可以支持多个用户。
可以在专用命名空间中创建 对象。 有关详细信息,请参阅 对象命名空间。
返回值
如果函数成功,则返回值是信号灯对象的句柄。 如果命名信号灯对象在函数调用之前存在,则函数返回现有对象的句柄, GetLastError 返回 ERROR_ALREADY_EXISTS。
如果函数失败,则返回值为 NULL。 要获得更多的错误信息,请调用 GetLastError。
注解
CreateSemaphore 返回的句柄具有SEMAPHORE_ALL_ACCESS访问权限;它可用于需要信号灯对象句柄的任何函数中,前提是调用方已被授予访问权限。 如果信号灯是从服务或模拟其他用户的线程创建的,则可以在创建信号灯时向其应用安全描述符,或通过更改其默认 DACL 来更改创建过程的默认安全描述符。 有关详细信息,请参阅 Synchronization Object Security and Access Rights。
信号灯对象的状态在计数大于零时发出信号,当其计数等于零时,将发出非信号。 lInitialCount 参数指定初始计数。 计数不能小于零或大于 lMaximumCount 参数中指定的值。
调用进程的任何线程都可以在调用其中一个 等待函数时指定信号灯对象句柄。 当指定对象的状态被发出信号时,单对象等待函数将返回。 当任何一个或所有指定对象都收到信号时,可以指示多对象等待函数返回。 当等待函数返回时,将释放等待线程以继续执行。 每次线程完成等待信号灯对象时,信号灯对象的计数都会递减 1。 线程完成后,它将调用 ReleaseSemaphore 函数,该函数递增信号灯对象的计数。
多个进程可以具有同一信号灯对象的句柄,从而允许使用 对象进行进程间同步。 可以使用以下对象共享机制:
- 如果 CreateSemaphore 的 lpSemaphoreAttributes 参数启用了继承,则 CreateProcess 函数创建的子进程可以继承 信号灯 对象的句柄。
- 进程可以在调用 DuplicateHandle 函数时指定信号灯对象句柄,以创建可由另一个进程使用的重复句柄。
- 进程可以在调用 OpenSemaphore 或 CreateSemaphore 函数时指定信号灯对象的名称。
示例
有关使用 CreateSemaphore 的示例,请参阅 Using Semaphore Objects。
要求
要求 | 值 |
---|---|
最低受支持的客户端 | Windows XP [桌面应用 | UWP 应用] |
最低受支持的服务器 | Windows Server 2003 [桌面应用 | UWP 应用] |
目标平台 | Windows |
标头 | synchapi.h (包括 Windows.h) |
Library | Kernel32.lib |
DLL | Kernel32.dll |