信号量
● CreateSemaphore
函数原型
1 HANDLE WINAPI CreateSemaphore( 2 _In_opt_ LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, 3 _In_ LONG lInitialCount, 4 _In_ LONG lMaximumCount, 5 _In_opt_ LPCTSTR lpName 6 );
○ 参数1:lpSemaphoreAttributes [in, optional]
指向SECURITY_ATTRIBUTES结构的指针。如果此参数为NULL,则处理不能由子进程继承。
○ 参数2:llInitialCount [in]
这个信号量对象的初始计数。这个值必须大于或等于0,小于等于lMaximumCount。信号量的状态是当计数大于0时的信号,当它为零的时候没有信号。当等待函数释放等待信号量的线程时,计数会减少1。通过调用ReleaseSemaphore函数来增加指定数量的计数。
○ 参数3:llMaximumCount [in]
这个信号量对象的最大计数。这个值必须大于零。
○ 参数4:lpName [in, optional]
信号量对象的名称。名称长度限于MAX_PATH字符。名称比较是区分大小写的。
○ Return value 返回值:HANDLE
如果函数成功,返回值是对信号量对象的句柄。如果在函数调用之前存在已命名的信号量对象,则函数返回现有对象的句柄,GetLastError返回error_already_存在。
如果函数失败,返回值为NULL。要得到扩展的错误信息,请调用GetLastError。
● OpenSemaphore
函数原型
1 HANDLE WINAPI OpenSemaphore( 2 _In_ DWORD dwDesiredAccess, 3 _In_ BOOL bInheritHandle, 4 _In_ LPCTSTR lpName 5 );
○ 参数1:dwDesiredAccess [in]
对信号量对象的访问。如果指定对象的安全描述符不允许调用进程的请求访问,则该函数失败。有关访问权限的列表.
○ 参数2:bInheritHandle [in]
如果这个值是真的,这个进程创建的进程将继承这个句柄。否则,进程不会继承这个句柄。
○ 参数3:lpName [in]
要打开的信号量的名称。名称比较是区分大小写的。
○ Return value 返回值:HANDLE
如果函数成功,返回值是对信号量对象的句柄。
如果函数失败,返回值为NULL。要得到扩展的错误信息,请调用GetLastError。
● ReleaseSemaphore
函数原型
1 BOOL WINAPI ReleaseSemaphore( 2 _In_ HANDLE hSemaphore, 3 _In_ LONG lReleaseCount, 4 _Out_opt_ LPLONG lpPreviousCount 5 );
○ 参数1:HANDLE hSemaphore
CreateSemaphore 或者 OpenSemaphore 返回的句柄
SEMAPHORE_MODIFY_STATE权限。有关更多信息,请参见同步对象安全性和访问权限。
○ 参数2:LONG lReleaseCount
用于增加信号量对象当前计数的量。值必须大于零。如果指定的数量会导致信号量的计数超过在创建信号量时指定的最大值,计数不会改变,函数返回FALSE。
○ 参数3:LPLONG lpPreviousCount
一个指向一个变量的指针,以接收之前对信号量的计数。如果不需要以前的计数,该参数可以为空。
○ Return value 返回值:BOOL
成功返回一个非零的数
错误返回 0 使用GetLastError 获取错误信息
1 #define UNICODE 2 #include <stdio.h> 3 #include <process.h> 4 #include <windows.h> 5 6 //能够启动多少次 7 8 int main() 9 { 10 //Semaphroe 11 // 计数 count 能够 wait多少次 每次使用wait 都会递减 12 HANDLE hSemaphroe = CreateSemaphore(nullptr, 0, 5, TEXT("Demo")); 13 //OpenSemaphore(SEMAPHORE_ALL_ACCESS, FALSE, TEXT("Demo")); 14 ReleaseSemaphore(hSemaphroe, 2, nullptr); 15 WaitForSingleObject(hSemaphroe, INFINITE); 16 WaitForSingleObject(hSemaphroe, INFINITE); 17 WaitForSingleObject(hSemaphroe, INFINITE); 18 WaitForSingleObject(hSemaphroe, INFINITE); 19 WaitForSingleObject(hSemaphroe, INFINITE); 20 WaitForSingleObject(hSemaphroe, INFINITE); 21 return 0; 22 }