信号量Semaphore的问题
这个其实是MSDN里面的代码,刚开始接触这个Semaphore,还不太懂。
#define MAX_SEM_COUNT 10
#define THREADCOUNT 12
HANDLE ghSemaphore;
DWORD WINAPI ThreadProc( LPVOID );
int main(int argc, char* argv[])
{
HANDLE aThread[THREADCOUNT];
DWORD ThreadID;
int i;
ghSemaphore = CreateSemaphore(
NULL,
MAX_SEM_COUNT,
MAX_SEM_COUNT,
NULL);
if (ghSemaphore == NULL)
{
printf("CreateSemaphore error: %d\n", GetLastError());
return 0;
}
for( i=0; i < THREADCOUNT; i++ )
{
aThread[i] = CreateThread(
NULL,
0,
(LPTHREAD_START_ROUTINE) ThreadProc,
NULL,
0,
&ThreadID);
if( aThread[i] == NULL )
{
printf("CreateThread error: %d\n", GetLastError());
return 0;
}
}
Sleep(2000);
WaitForMultipleObjects(THREADCOUNT, aThread, TRUE, INFINITE);
for( i=0; i < THREADCOUNT; i++ )
CloseHandle(aThread[i]);
CloseHandle(ghSemaphore);
return 0;
}
DWORD WINAPI ThreadProc( LPVOID lpParam )
{
DWORD dwWaitResult;
BOOL bContinue = true;
while(bContinue)
{
dwWaitResult = WaitForSingleObject(
ghSemaphore,
0L);
switch (dwWaitResult)
{
case WAIT_OBJECT_0:
{
bContinue = false ;
printf("Thread %d: wait succeeded\n", GetCurrentThreadId());
Sleep(500);
if (!ReleaseSemaphore(
ghSemaphore,
1,
NULL) )
{
printf("ReleaseSemaphore error: %d\n", GetLastError());
}
break;
}
case WAIT_TIMEOUT:
{
printf("Thread %d: wait timed out\n", GetCurrentThreadId());
break;
}
}
}
return TRUE;
}
结果:
Thread 1532: wait succeeded
Thread 5508: wait succeeded
Thread 220: wait succeeded
Thread 2644: wait succeeded
Thread 6008: wait succeeded
Thread 6008: wait succeeded
Thread 5980: wait succeeded
Thread 4492: wait succeeded
Thread 5084: wait succeeded
Thread 4860: wait succeeded
Thread 544: wait succeeded
Thread 3640: wait timed out
Thread 3640: wait timed out
Thread 3668: wait timed out
Thread 3640: wait timed out
Thread 3668: wait timed out
Thread 3640: wait timed out
Thread 3668: wait timed out
Thread 3668: wait timed out
Thread 3640: wait timed out
Thread 3668: wait timed out
Thread 3640: wait timed out
Thread 3668: wait timed out
Thread 3668: wait timed out
Thread 3640: wait timed out
Thread 3668: wait timed out
Thread 3640: wait timed out
Thread 3668: wait timed out
Thread 3640: wait timed out
Thread 3668: wait timed out
Thread 3640: wait timed out
Thread 3668: wait timed out
Thread 3640: wait timed out
Thread 3668: wait timed out
Thread 3640: wait timed out
Thread 3668: wait timed out
Thread 3640: wait timed out
Thread 3668: wait timed out
Thread 3640: wait timed out
Thread 3668: wait timed out
Thread 3640: wait timed out
Thread 3668: wait timed out
Thread 3640: wait timed out
Thread 3668: wait timed out
Thread 3640: wait timed out
Thread 3668: wait timed out
Thread 3640: wait timed out
Thread 3668: wait succeeded
Thread 3640: wait succeeded
Press any key to continue。。。
出现了2个6008线程,这个为什么呢?
第一次获取成功的时候bContinue = false了。