HANDLE WINAPI CreateSemaphore(
__in LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,
__in LONG lInitialCount, //0
__in LONG lMaximumCount, //0
__in LPCTSTR lpName
);
//然后,下面这个函数调用失败?
BOOL WINAPI ReleaseSemaphore(
__in HANDLE hSemaphore,
__in LONG lReleaseCount,//1
__out LPLONG lpPreviousCount
);//如何wait ?再看一份源代码里面看到,不知道这样设计有何意义?这个信号不是怎么都不触发了么?
是别人设计一个线程池函数。
里面的semaphore对象是用来同步线程数目。
CreateSemaphore中的参数lInitialCount表示,信标对象初始化时的信号的计数,
参数lMaximumCount中表示,信标对象信号的最大计数,也就是这个信标最多允许几个线程来使用它。当一个信标的信号计数大于0时,它就是信号态。否则,它就是非信号态的。如果信标处于信号态的,那么一个线程中对信标使用WaitForSingleObject,返回立刻返回,此时信标的信号计数会减1,当线程对信标使用ReleaseSemaphore时,信标的信号计数会加1.当Semaphore对象的信号计数为n时,这意味着,前n个线程对信标使用WaitForsingleObject,就会立刻返回,但是第n+1个线程对信标再次使用WaitForsingleObject时,就会被挂起。因为当第n+1个线程启动时,信标已经处于非信号态了。