WinAPI之ReleaseSemaphore

ReleaseSemaphore 功能
按指定数量增加指定信号量对象的计数。

语法
C++

BOOL WINAPI ReleaseSemaphore(
  _In_      HANDLE hSemaphore,
  _In_      LONG   lReleaseCount,
  _Out_opt_ LPLONG lpPreviousCount
);


参数
hSemaphore在]
信号量对象的句柄。 CreateSemaphore 或 OpenSemaphore 函数返回此句柄。


此句柄必须具有SEMAPHORE_MODIFY_STATE访问权限。有关详细信息, 请参阅同步对象安全和访问权限.

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

lpPreviousCount[出, 可选]
指向要接收信号量的上一个计数的变量的指针。如果不需要上一个计数, 则此参数可以为NULL 。

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

如果函数失败, 返回值为零。要获取扩展错误信息, 请调用时出错.

言论
当信号对象的计数大于零, 并且在其计数等于零时 nonsignaled 的状态将发出信号。调用 CreateSemaphore 函数的进程指定信号量的初始计数。每次由于信号量的终止状态而释放等待线程时, 信号量的计数将减少一个。

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

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


无法使用ReleaseSemaphore减少信号量对象计数, 因为lReleaseCount不能为负数。若要临时限制或减少访问, 请创建一个循环, 在其中调用 WaitForSingleObject 函数, 其超时间隔为零, 直到信号量计数已足够减少为止。(请注意, 其他线程可以在执行此循环时减少计数。要恢复访问, 请调用ReleaseSemaphore , 其释放计数等于在循环中调用WaitForSingleObject的次数。

猜你喜欢

转载自blog.csdn.net/xinqingwuji/article/details/79996218
今日推荐