My Study/System

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
,

최근 댓글

최근 트랙백

알림

이 블로그는 구글에서 제공한 크롬에 최적화 되어있고, 네이버에서 제공한 나눔글꼴이 적용되어 있습니다.