Critical Section(임계 영역) - CRITICAL_SECTION
멀티 쓰레드를 잘 사용하고 싶은 마음에 방학 동안 동기화 시키는 방법에 대해서 공부하고자 한다 ㅋㅋ 첫번째로 크리티컬 섹션에 대해서 시작...
CRITICAL_SECTION(이하 크리티컬 섹션)은 구간을 설정하여 그 구간에 진입한 쓰레드가 구간을 벗어날 때까지 해당 구간이 끝날 때까지 다른 쓰레드가 크리티컬 섹션에 진입하는 것을 막는다.
[API 호출 순서를 보았더니 이해가 더 잘되었다. ㅋㅋ]
크리티컬 섹션 사용법은 크리티컬 섹션 오브젝트를 생성하고 초기화를 한다. 그 다음 임계 영역에 진입하기 위해서 크리티컬 섹션 오브젝트를 획득하고 빠져 나갈 곳에서 반환을 한다. 다 사용을 했으면 크리티컬 섹션 오브젝트를 반환 함으로 끝난다.
위의 순서대로 적으면 아래와 같다.
1. 크리티컬 섹션 오브젝트를 선언해준다.
class critical_section;
2. 크리티컬 섹션 오브젝트를 초기화 한다.
void WINAPI InitializeCriticalSection(
_Out_ LPCRITICAL_SECTION lpCriticalSection
);
3. 임계 영역에 크리티컬 섹션 오브젝트를 들어가기 위해서 사용하는 API 이다.
void WINAPI EnterCriticalSection(
_Inout_ LPCRITICAL_SECTION lpCriticalSection
);
4. 3번과 반대로 임계 영역을 빠져 나오는 API이다.
void WINAPI LeaveCriticalSection(
_Inout_ LPCRITICAL_SECTION lpCriticalSection
);
5. 크리티컬 섹션 오브젝트를 다 사용하고 반환한다.
void WINAPI DeleteCriticalSection(
_Inout_ LPCRITICAL_SECTION lpCriticalSection
);
모든 API 는 크리티컬 섹션 오브젝트를 파라미터를 가진다.
앞 글에서의 임계 영역이 생길 수 있는 것을 크리티컬 섹션으로 해결해보자.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | CRITICAL_SECTION CriticalSection; unsigned int WINAPI ThreadProc1(LPVOID lpParam) { for (DWORD i = 1; i <= 1000; i++) { EnterCriticalSection(&CriticalSection); Sleep(1); Count++; LeaveCriticalSection(&CriticalSection); } return 0; } unsigned int WINAPI ThreadProc2(LPVOID lpParam) { for (DWORD i = 1; i <= 1000; i++) { EnterCriticalSection(&CriticalSection); Sleep(1); Count++; LeaveCriticalSection(&CriticalSection); } return 0; } int _tmain() { InitializeCriticalSection(&CriticalSection); //코드 생략 DeleteCriticalSection(&CriticalSection); } | cs |
위 예제도 역시나 코드 중 일부이다. 2번째 줄에서 크리티컬 섹션 오브젝트를 생성하고 있다. 그 다음 34번 줄에서 크리티컬 섹션 오브젝트를 초기화 한 뒤 임계 영역이였던 부분에 감싸 해결을 하였다. 그리고 마지막에 크리티컬 섹션 오브젝트를 반환함으로 크리티컬 섹션은 마치겠다.
'My Study > System' 카테고리의 다른 글
Critical Section(임계 영역) - Mutex (0) | 2016.07.06 |
---|---|
Critical Section(임계 영역) - Interlocked (0) | 2016.07.05 |
Critical Section(임계 영역) 개념 (0) | 2016.07.04 |
Process Handle (0) | 2016.06.30 |
Kernel Object (0) | 2016.06.29 |