2008. 10. 3. 22:11

[쓰레드기법] Bad Synchronization

출처 : 신경준씨 사외교육, http://blog.naver.com/process3/20052147545

#include "stdafx.h"
#include <windows.H>
#include <stdio.H>
#include <tchar.H>


#define LOOP_CNT 500000
int  nData = 0;

CRITICAL_SECTION CriticalSection;

void Produce(int &nData)
{
 nData++;
 Sleep(0);
}

void Consume(int &nData)
{
 nData--;
 Sleep(0);
}

DWORD CALLBACK ProduceThread(void* arg)
{
 int  nCnt = 0;
 BOOL bRun = TRUE;

 while(TRUE == bRun)
 {
  EnterCriticalSection(&CriticalSection);

  Produce(nData);
  nCnt++;
  if( LOOP_CNT == nCnt)
  {
   bRun = FALSE;
  }

  LeaveCriticalSection(&CriticalSection);

 }

 _tprintf(_T("ProduceThread %d\n"), nCnt);   

 return 0;
}

DWORD CALLBACK ConsumeThread(void* arg)
{
 int  nCnt = 0;
 BOOL bRun = TRUE;

 while(TRUE == bRun)
 {
  EnterCriticalSection(&CriticalSection);

  Consume(nData);
  nCnt++;
  if( LOOP_CNT == nCnt)
  {
   bRun = FALSE;
  }

  LeaveCriticalSection(&CriticalSection);
 }

 _tprintf(_T("ConsumeThread %d\n"), nCnt);   
 
 return 0;
}

int _tmain(int argc, _TCHAR* argv[])
{
 HANDLE hThread[2] = {NULL};

 InitializeCriticalSection(&CriticalSection);
  
 DWORD startTime = GetTickCount();   

 hThread[0] = CreateThread(NULL, 0, ProduceThread, (LPVOID)0, 0, NULL);   
 hThread[1] = CreateThread(NULL, 0, ConsumeThread, (LPVOID)0, 0, NULL);   
 
 WaitForMultipleObjects(2, hThread, TRUE, INFINITE);   

 _tprintf(_T("%d %d\n"), GetTickCount() - startTime, nData);   

 DeleteCriticalSection(&CriticalSection);

 return 0;
}