CreateSemaphore函数

创建或打开命名或未命名的信号量对象。

要指定对象的访问掩码,请使用CreateSemaphoreEx函数。

语法

HANDLE WINAPI CreateSemaphore(
  _In_opt_ LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,
  _In_ LONG lInitialCount,
  _In_ LONG lMaximumCount,
  _In_opt_ LPCTSTR lpName
);


参数
lpSemaphoreAttributes [in,optional]
指向SECURITY_ATTRIBUTES结构的指针。如果此参数为NULL,则子进程无法继承句柄。

结构的lpSecurityDescriptor成员为新信号量指定安全描述符。如果此参数为NULL,则信号量将获取默认安全描述符。信号量的默认安全描述符中的ACL来自创建者的主要或模拟令牌。

lInitialCount [in]
信号量对象的初始计数。该值必须大于或等于零且小于或等于lMaximumCount。信号量的状态在其计数大于零时发出信号,在信号为零时发出信号。只要wait函数释放等待信号量的线程,计数就会减1。通过调用ReleaseSemaphore函数将计数增加指定的量。

lMaximumCount [in]
信号量对象的最大计数。该值必须大于零。

lpName [in,optional]
信号量对象的名称。名称仅限于MAX_PATH个字符。名称比较区分大小写。

如果lpName与现有命名信号量对象的名称匹配,则此函数请求SEMAPHORE_ALL_ACCESS访问权限。在这种情况下,lInitialCount和lMaximumCount参数将被忽略,因为它们已由创建过程设置。如果lpSemaphoreAttributes参数不为NULL,则确定是否可以继承句柄,但忽略其安全描述符成员。

如果lpName为NULL,则创建没有名称的信号量对象。

如果lpName与现有事件,mutex,waitable计时器,作业或文件映射对象的名称匹配,则函数将失败,GetLastError函数将返回ERROR_INVALID_HANDLE。这是因为这些对象共享相同的命名空间。

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

可以在私有名称空间中创建对象。有关更多信息,请参阅对象命名空间。

返回值
如果函数成功,则返回值是信号量对象的句柄。如果在函数调用之前存在命名的信号量对象,则该函数返回现有对象的句柄,GetLastError返回ERROR_ALREADY_EXISTS。

如果函数失败,则返回值为NULL。要获取扩展错误信息,请调用GetLastError。

备注
CreateSemaphore返回的句柄具有SEMAPHORE_ALL_ACCESS访问权限;它可以在任何需要信号量对象句柄的函数中使用,前提是调用者已被授予访问权限。如果从服务或模拟其他用户的线程创建信号量,则可以在创建信号量时将安全描述符应用于信号量,或者通过更改其默认DACL来更改创建过程的默认安全描述符。有关更多信息,请参阅同步对象安全性和访问权限。

信号量对象的状态在其计数大于零时发出信号,并在其计数等于零时发出信号。 lInitialCount参数指定初始计数。计数永远不会小于零或大于lMaximumCount参数中指定的值。

调用进程的任何线程都可以在调用其中一个等待函数时指定信号量对象句柄。当指示对象的状态发出信号时,单对象等待函数返回。可以指示多对象等待函数在任何一个或所有指定对象发出信号时返回。当wait函数返回时,释放等待线程以继续执行。每次线程完成等待信号量对象的等待时,信号量对象的计数减1。线程完成后,它会调用ReleaseSemaphore函数,该函数会增加信号量对象的计数。

多个进程可以具有相同信号量对象的句柄,从而可以使用该对象进行进程间同步。可以使用以下对象共享机制:

由CreateProcess函数创建的子进程可以继承
 

你可能感兴趣的:(API,CreateSemaphore)