Semaphore用于对资源进行计数.允许一定数量的线程同时访问该资源.可以用于进程间同步
相关函数
CreateSemaphore 创建或打开一个信号量对象
HANDLE WINAPI CreateSemaphore( _In_opt_ LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, _In_ LONG lInitialCount, _In_ LONG lMaximumCount, _In_opt_ LPCTSTR lpName );
lpSemaphoreAttributes表示安全控制,一般直接用NULL.
lInitialCount表示初始资源数量(必须>=0且<=lMaximumCount).
lMaximumCount表示最大并发数量(必须>0).
lpName表示信号量名称.
若信号量创建成功,则返回其句柄,否则返回NULL.
OpenSemaphore打开一个已存在信号量
HANDLE WINAPI OpenSemaphore( _In_ DWORD dwDesiredAccess, _In_ BOOL bInheritHandle, _In_ LPCTSTR lpName );
dwDesiredAccess表示访问权限,一般用SEMAPHORE_ALL_ACCESS.
bInheritHandle表示信号量句柄继承性,一般用TRUE.
lpName表示要打开的信号量名称.
若打开成功则返回信号量句柄,否则返回NULL.
ReleaseSemaphore增加指定信号量lReleaseCount个资源
BOOL WINAPI ReleaseSemaphore( _In_ HANDLE hSemaphore, _In_ LONG lReleaseCount, _Out_opt_ LPLONG lpPreviousCount );
hSemaphore表示信号量句柄.
lReleaseCount表示增加资源数(必须>0).若该数会导致增加后资源数大于lMaximumCount,则导致调用失败.
lpPreviousCount用来获取函数调用前资源数.
若资源增加成功则返回非0,否则返回0.
信号量使用完成,调用CloseHandle进行清理(所有内核对象都可以使用CloseHandle清理).
若资源数大于0,则信号量处于有信号状态.线程使用指定资源前,调用类似WaitForSingleObject的等待函数.若该函数正常返回,则资源数减1.该线程继续执行.线程使用资源完毕后,调用ReleaseSemaphore增加资源数.
https://msdn.microsoft.com/en-us/library/ms686946(v=vs.85).aspx