多线程相关------信号量Semaphore

时间:2021-08-03 10:06:38

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