프로그래밍 세계/Windows Programming

[쓰레드기법] Semaphore Example

깡다구짱 2008. 10. 3. 22:14

출처 : 신경준씨 사외교육 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;

}