System2008. 11. 25. 15:38

크리티컬 섹션을 사용하는 방법은 의외로 간단합니다.

1. CRITICAL_SECTION   hCriticalSection;
크리티컬 섹션을 선언합니다.
여기서는 이름을 hCriticalSection 이라고 했습니다.

2. InitializeCriticalSection(&hCriticalSection);
크리티컬 섹션을 초기화합니다.

3. EnterCriticalSection (&hCriticalSection);
임계영역에 진입직전에 호출합니다.

4. LeaveCriticalSection (&hCriticalSection);
임계영역에서 나오자마자 호출합니다.

5. DeleteCriticalSection(&hCriticalSection);
더이상 크리티컬 섹션이 필요없거나, 프로그램 종료시에 크리티컬 섹션을 해제합니다.

  1. /*  
  2. CriticalSectionSync.cpp  
  3. 프로그램 설명: 생성 가능한 쓰레드의 개수 측정.  
  4. */ 
  5.  
  6. #include <stdio.h>  
  7. #include <windows.h>  
  8. #include <process.h>  
  9. #include <tchar.h>  
  10.  
  11. #define NUM_OF_GATE     6  
  12.  
  13. LONG gTotalCount = 0;  
  14.  
  15. CRITICAL_SECTION   hCriticalSection;  
  16.  
  17.  
  18. void IncreaseCount()  
  19. {  
  20.     EnterCriticalSection (&hCriticalSection);  
  21.     gTotalCount++;  
  22.     LeaveCriticalSection (&hCriticalSection);  
  23. }  
  24.  
  25.  
  26. unsigned int WINAPI ThreadProc( LPVOID lpParam )   
  27. {   
  28.     for(DWORD i=0; i<1000; i++)  
  29.     {  
  30.         IncreaseCount();  
  31.     }  
  32.  
  33.     return 0;  
  34. }   
  35.  
  36.  
  37. int _tmain(int argc, TCHAR* argv[])  
  38. {  
  39.     DWORD dwThreadId[NUM_OF_GATE];  
  40.     HANDLE hThread[NUM_OF_GATE];  
  41.  
  42.     InitializeCriticalSection(&hCriticalSection);  
  43.  
  44.     for(DWORD i=0; i<NUM_OF_GATE; i++)  
  45.     {  
  46.         hThread[i] = (HANDLE)  
  47.             _beginthreadex (   
  48.             NULL,  
  49.             0,                        
  50.             ThreadProc,                 
  51.             NULL,                      
  52.             CREATE_SUSPENDED,            
  53.             (unsigned *)&dwThreadId[i]     
  54.         );  
  55.  
  56.         if(hThread[i] == NULL)  
  57.         {  
  58.             _tprintf(_T("Thread creation fault! \n"));  
  59.             return -1;  
  60.         }  
  61.     }  
  62.  
  63.     for(DWORD i=0; i<NUM_OF_GATE; i++)  
  64.     {  
  65.         ResumeThread(hThread[i]);  
  66.     }  
  67.  
  68.  
  69.     WaitForMultipleObjects(NUM_OF_GATE, hThread, TRUE, INFINITE);  
  70.  
  71.     _tprintf(_T("total count: %d \n"), gTotalCount);  
  72.  
  73.     for(DWORD i=0; i<NUM_OF_GATE; i++)  
  74.     {  
  75.         CloseHandle(hThread[i]);  
  76.     }  
  77.  
  78.     DeleteCriticalSection(&hCriticalSection);  
  79.  
  80.     return 0;  
  81. }  
쓰레드 6개를 생성해서, 각각의 쓰레드가 gTotalCount 을 1000씩 더하는 예제입니다.

 
Posted by skensita