ReleaseSemaphore 函数 (synchapi.h)

将指定信号灯对象的计数增加指定的量。

语法

BOOL ReleaseSemaphore(
  [in]            HANDLE hSemaphore,
  [in]            LONG   lReleaseCount,
  [out, optional] LPLONG lpPreviousCount
);

参数

[in] hSemaphore

信号灯对象的句柄。 CreateSemaphoreOpenSemaphore 函数返回此句柄。

此句柄必须具有 SEMAPHORE_MODIFY_STATE 访问权限。 有关详细信息,请参阅 Synchronization Object Security and Access Rights

[in] lReleaseCount

信号灯对象的当前计数要增加的量。 该值必须大于零。 如果指定的量会导致信号灯的计数超过创建信号灯时指定的最大计数,则计数不会更改,并且函数返回 FALSE

[out, optional] lpPreviousCount

指向变量的指针,用于接收信号灯的上一个计数。 如果不需要以前的计数,此参数可以为 NULL

返回值

如果该函数成功,则返回值为非零值。

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

注解

信号灯对象的状态在计数大于零时发出信号,当其计数等于零时将发出非信号。 调用 CreateSemaphore 函数的进程指定信号灯的初始计数。 每次由于信号灯的信号状态而释放等待的线程时,信号灯的计数都会减少一个。

通常,应用程序使用信号灯来限制使用资源的线程数。 在线程使用资源之前,它会在调用其中一个 等待函数时指定信号灯句柄。 当 wait 函数返回时,它会将信号灯的计数减少 1。 线程使用完资源后,会调用 ReleaseSemaphore ,将信号灯的计数增加 1。

ReleaseSemaphore 的另一个用途是在应用程序初始化期间。 应用程序可以创建初始计数为零的信号灯。 这会将信号灯的状态设置为未签名,并阻止所有线程访问受保护的资源。 当应用程序完成初始化时,它使用 ReleaseSemaphore 将计数增加到其最大值,以允许对受保护资源的正常访问。

无法使用 ReleaseSemaphore 减少信号灯对象计数,因为 lReleaseCount 不能为负数。 若要暂时限制或减少访问,请创建一个循环,在该循环中调用 WaitForSingleObject 函数,超时间隔为零,直到信号灯计数已充分减少。 (请注意,在执行此循环时,其他线程可以减少计数。) 若要还原访问权限,请调用 ReleaseSemaphore ,其发布计数等于在循环中调用 WaitForSingleObject 的次数。

示例

有关使用 ReleaseSemaphore 的示例,请参阅 使用 Semaphore 对象

要求

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

另请参阅

CreateSemaphore

OpenSemaphore

信号灯对象

同步函数