[쓰레드기법] Semaphore Example
출처 : 신경준씨 사외교육 http://blog.naver.com/process3/20052147545
#include "stdafx.h"
#include <windows.h>
#include "process.h"
#define THREAD_NUM 10
#define INIT_COUNT 0
#define TOTAL_COUNT 10
#define RELEASE_COUNT 1
int g_nIndex = 0;
typedef struct msg_block_tag
{
HANDLE hSemaphore;
} THREAD_ARG;
void PrintTrace()
{
_tprintf(_T("Thread Exit ID = %d|%0x \n"), g_nIndex, GetThreadId(GetCurrentThread()));
g_nIndex++;
}
unsigned int WINAPI TestThread(LPVOID lpThreadData);
int _tmain(int argc, _TCHAR* argv[])
{
unsigned int unThreadId = 0;
THREAD_ARG stThreadArg;
int i = 0;
HANDLE hThread[THREAD_NUM] = {NULL};
LONG lPreviousCount = 0;
stThreadArg.hSemaphore = CreateSemaphore(NULL, INIT_COUNT, TOTAL_COUNT, NULL);
for( i = 0; i < THREAD_NUM; i++)
{
hThread[i] = (HANDLE)_beginthreadex(NULL, 0, TestThread, &stThreadArg, 0, &unThreadId);
}
ReleaseSemaphore(stThreadArg.hSemaphore, RELEASE_COUNT, &lPreviousCount );
WaitForMultipleObjects(THREAD_NUM, hThread, TRUE, INFINITE);
for( i = 0; i < THREAD_NUM; i++)
{
CloseHandle(hThread[i]);
hThread[i] = NULL;
}
CloseHandle(stThreadArg.hSemaphore);
stThreadArg.hSemaphore = NULL;
return 0;
}
unsigned int WINAPI TestThread(LPVOID lpThreadData)
{
THREAD_ARG *lpArg = (THREAD_ARG*)lpThreadData;
DWORD dwThreadStatus = 0;
LONG lPreviousCount = 0;
while(TRUE)
{
dwThreadStatus = WaitForSingleObject(lpArg->hSemaphore, INFINITE);
}
}
return 0;
}