一、What is Semaphore(信号量)
A semaphore object is a synchronization object that maintains a count between zero and a specified maximum value.
信号量是用于线程同步的内核对象,用来对资源进行计数.
它包含:
使用计数
最大资源计数(32位)
当前资源计数(32位)
最大资源计数在CreateSemaphore时指定
HANDLE WINAPI CreateSemaphore(
LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,
LONG lInitialCount,
LONG lMaximumCount,
LPCTSTR lpName);
lMaximumCount —— 最大资源计数
lInitialCount —— 当前资源计数的初始值
二、Rules
- 如果当前资源计数大于0,那么信号量处于触发状态.
- 如果当前资源计数等于0,那么信号量处于非触发状态.
- 当前资源计数的范围:>=0 && <=最大资源计数
- 当wait函数调用成功时,当前资源计数会递减1.
- 通过调用ReleaseSemaphore来以指定值递增信号量的当前资源计数.
Note:
1.当前资源计数的递增只能靠程序员通过调用ReleaseSemaphore实现.
当前资源计数的递减只能通过成功调用wait函数实现.
BOOL WINAPI ReleaseSemaphore(
HANDLE hSemaphore,
LONG lReleaseCount,
LPLONG lpPreviousCount);
lReleaseCount
—— 必须大于0,也就是说ReleaseSemaphore只能递增当前资源计数,不能递减.
ReleaseSemaphore用于将当前资源计数 += lReleaseCount,若结果>最大资源计数,则函数调用失败,不会改变当前资源计数.
2.Create Semaphore内核对象时,通常将当前资源计数的初始值设为最大资源计数值.
但有时也会采用这样的策略:在程序初始化时创建Semaphore,并将当前资源计数的初始值设为0,等程序初始化完成时再通过
ReleaseSemaphore使Semaphore处于触发状态.