CreateSemaphore

【勇芳软件工作室】汉化HomePreviousNext

CreateSemaphore函数创建一个命名或未命名的信号量对象。

手柄CreateSemaphore(

LPSECURITY_ATTRIBUTES 【lpSemaphoreAttributes】,//指向安全属性的指针
LONG 【lInitialCount】,//初始计数
LONG 【lMaximumCount】,//最大计数
LPCTSTR 【lpName】//指向信号量对象名称的指针
); 

参数

【lpSemaphoreAttributes】

指向SECURITY_ATTRIBUTES结构的指针,用于确定返回的句柄是否可由子进程继承。如果【lpSemaphoreAttributes】为NULL,则无法继承该句柄。

Windows NT:结构的lpSecurityDescriptor成员指定新信号量的安全描述符。如果【lpSemaphoreAttributes】为NULL,则信号量将获取默认安全描述符。

Windows 95:结构的lpSecurityDescriptor成员将被忽略。

【lInitialCount】

指定信号量对象的初始计数。该值必须大于或等于零且小于等于【lMaximumCount】.信号量的状态当其计数大于零时发出信号,而当信号量为零时,信号量的状态为非信号。等待功能释放等待信号量的线程时,计数减少1。通过调用ReleaseSemaphore功能,增加指定的数量。

【lMaximumCount】

指定信号量对象的最大计数。该值必须大于零。

【lpName】

指向一个以null结尾的字符串,指定信号量对象的名称。该名称仅限于MAX_PATH个字符,并且可以包含除反斜杠路径分隔符(\\)之外的任何字符。名称比较区分大小写。

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

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

如果【lpName】匹配现有事件,互斥体或文件映射对象的名称,则该函数将失败,并且GetLastError函数返回ERROR_INVALID_HANDLE。这是因为事件,互斥体,信号量和文件映射对象共享相同的名称空间。

返回值

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

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

备注

CreateSemaphore返回的句柄对新的信号量对象进行了SEMAPHORE_ALL_ACCESS访问,可用于需要对信号量对象处理的任何函数。

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

信号量对象的状态在其计数大于零时发出信号,当其计数等于零时,信号量对象的状态为非信号。【lInitialCount】参数指定初始计数。由于信号量的信号状态,每次等待线程被释放时,信号量的计数减少一个。使用ReleaseSemaphore函数将信号量的计数增加一定量。计数永远不能小于零或大于【lMaximumCount】参数中指定的值。

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

*如果CreateSemaphore参数CreateSemaphore启用继承,则CreateProcess函数创建的子进程可以继承信号量对象的句柄。

*进程可以在调用DuplicateHandle函数时指定信号量对象句柄,以创建另一个进程可以使用的重复句柄。

*进程可以在调用OpenSemaphoreCreateSemaphore函数时指定信号量对象的名称。

使用CloseHandle功能关闭句柄。当过程终止时,系统自动关闭句柄。信号量对象在其最后一个句柄被关闭时被销毁。

也可以看看

CloseHandle, CreateProcess, DuplicateHandle, OpenSemaphore, ReleaseSemaphore, SECURITY_ATTRIBUTES