#include "stdafx.h"
#include "windows.h"
#include "stdio.h"
#define Max_Set_Count 6
#define THREADCOUNT 12
HANDLE hSemaphore;
DWORD WINAPI func(LPVOID)
{
BOOL bContinue = TRUE;
while(bContinue)
{
DWORD result = WaitForSingleObject(hSemaphore,3L);
switch(result)
{
case WAIT_OBJECT_0:
printf("Thread %d:wait succeed\n",GetCurrentThreadId());
bContinue = false;
Sleep(5);
if(!ReleaseSemaphore(hSemaphore,1,NULL))
{
printf("ReleaseSemaphore error:%d\n",GetLastError());
}
break;
case WAIT_TIMEOUT:
printf("Thread %d:wait time out\n",GetCurrentThreadId());
break;
}
}
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
HANDLE aThread[THREADCOUNT];
hSemaphore = CreateSemaphore(NULL,Max_Set_Count,Max_Set_Count,NULL);
if(hSemaphore == NULL)
{
printf("Create Semaphore error:%d\n",GetLastError());
return 0;
}
for(int i =0;i<THREADCOUNT;i++)
{
aThread[i] = CreateThread(NULL,0,func,NULL,0,NULL);
if(aThread[i] == NULL)
{
printf("CreateThread error:%d\n",GetLastError());
}
}
WaitForMultipleObjects(THREADCOUNT,aThread,true,INFINITE);
for(int i=0;i<THREADCOUNT;i++)
{
CloseHandle(aThread[i]);
}
CloseHandle(hSemaphore);
return 0;
}