크리티컬 섹션을 사용하는 방법은 의외로 간단합니다.
1. CRITICAL_SECTION hCriticalSection;
크리티컬 섹션을 선언합니다.
여기서는 이름을 hCriticalSection 이라고 했습니다.
2. InitializeCriticalSection(&hCriticalSection);
크리티컬 섹션을 초기화합니다.
3. EnterCriticalSection (&hCriticalSection);
임계영역에 진입직전에 호출합니다.
4. LeaveCriticalSection (&hCriticalSection);
임계영역에서 나오자마자 호출합니다.
5. DeleteCriticalSection(&hCriticalSection);
더이상 크리티컬 섹션이 필요없거나, 프로그램 종료시에 크리티컬 섹션을 해제합니다.
- /*
- CriticalSectionSync.cpp
- 프로그램 설명: 생성 가능한 쓰레드의 개수 측정.
- */
- #include <stdio.h>
- #include <windows.h>
- #include <process.h>
- #include <tchar.h>
- #define NUM_OF_GATE 6
- LONG gTotalCount = 0;
- CRITICAL_SECTION hCriticalSection;
- void IncreaseCount()
- {
- EnterCriticalSection (&hCriticalSection);
- gTotalCount++;
- LeaveCriticalSection (&hCriticalSection);
- }
- unsigned int WINAPI ThreadProc( LPVOID lpParam )
- {
- for(DWORD i=0; i<1000; i++)
- {
- IncreaseCount();
- }
- return 0;
- }
- int _tmain(int argc, TCHAR* argv[])
- {
- DWORD dwThreadId[NUM_OF_GATE];
- HANDLE hThread[NUM_OF_GATE];
- InitializeCriticalSection(&hCriticalSection);
- for(DWORD i=0; i<NUM_OF_GATE; i++)
- {
- hThread[i] = (HANDLE)
- _beginthreadex (
- NULL,
- 0,
- ThreadProc,
- NULL,
- CREATE_SUSPENDED,
- (unsigned *)&dwThreadId[i]
- );
- if(hThread[i] == NULL)
- {
- _tprintf(_T("Thread creation fault! \n"));
- return -1;
- }
- }
- for(DWORD i=0; i<NUM_OF_GATE; i++)
- {
- ResumeThread(hThread[i]);
- }
- WaitForMultipleObjects(NUM_OF_GATE, hThread, TRUE, INFINITE);
- _tprintf(_T("total count: %d \n"), gTotalCount);
- for(DWORD i=0; i<NUM_OF_GATE; i++)
- {
- CloseHandle(hThread[i]);
- }
- DeleteCriticalSection(&hCriticalSection);
- return 0;
- }