티스토리 뷰

C,C++

C++ : Critical Section [임계영역]

Andrew Shin 2015. 6. 25. 23:38

프로젝트가 보통규모 이상만 되어도 한 프로세스(Process)당 스레드(Thread)의 수가 굉장히 많아진다.


하지만 한 프로세스 내에서 여러 스레드가 하나의 자원을 동시에 사용하려고 하면 어떤 문제가 발생할까.


예를들어 어떤 식당에 종업원이 한명 있다고 해보자. 이 종업원을 하나의 객체라고 생각했을때, 아마도 C++ 클래스로는 간단하게 이런 형태로 짤 수 있지 않을까 싶다.


1
2
3
4
5
6
7
class 종업원
{
    private:
        bool isWork;
    public:
        void SetWork(bool work);
}    
cs


종업원이라는 클래스는 일을 하고있는지 안하고있는지를 저장하는 bool값 isWork 변수를 가지며 isWork의 상태를 바꾸어 줄 수 있는 SetWork를 인터페이스 함수로 가지고 있다.


손님이 있는 하나의 테이블을 하나의 스레드라고 했을때, 하나의 테이블에서 종업원을 불러서 일을 시키는것은 가능하지만, 여러개의 테이블에서 동시에 종업원을 불러서 일을 시키는 것은 불가능하다.


이렇듯 하나의 자원을 여러개의 스레드가 동시에 사용한다고 하면 큰 문제에 빠질 위험이 있다.

따라서 우리는 이러한 경우를 방지하기 위해서 Critical Section, 임계영역을 설정하게 된다.


임계 영역을 설정하게 되면 임계 영역 내부에 있는 작업에 하나의 스레드가 들어가있다면 다른 스레드는 그 작업이 끝날때까지 접근할 수 없게 된다.


사용방법에 대해서 간략히 살펴보자.


헤더부분에 임계영역으로 사용할 변수를 선언한다.


1
CRITICAL_SECTION mSc;
cs

그 다음 클래스의 생성자를 통해서 헤더에 선언한 임계영역을 초기화하는 함수를 넣고, 소멸자에서는 임계영역을 반환하는 함수를 넣는다.

1
2
 ::InitializeCriticalSection( &mSc );
::DeleteCriticalSection( &mSc );
cs

1번 라인이 임계영역을 초기화하는 함수, 2번 라인이 임계영역을 반환하는 함수이다.
이제 임계영역을 초기화하고 반환하는 생성자와 소멸자를 만들었으니 실제 임계영역을 사용할 일만 남았다.

1
2
3
4
5
6
7
::EnterCriticalSection( &mSc );
//    ~~~~~~~~~~~~~~~~~~~~~~~~~~ //
 
//보호해야 할 영역
 
 //   ~~~~~~~~~~~~~~~~~~~~~~~~~~ //
::LeaveCriticalSection( &mSc );
cs

이와같이 보호해야 할 영역을 사이에 두고 EnterCriticalSection 함수와 LeaveCriticalSection 함수를 사용하면 된다. 여기서 주의할 점은 엔터 크리티컬 섹션 함수로 임계영역에 들어갔으면 리브 크리티컬 섹션 함수로 반드시 떠나야 한다는 점이다. 즉 쌍을 이루어서 사용되어야 한다고 할 수 있다.


또한 CRITICAL_SECTION은 윈도우로부터 받은 핸들이므로 반드시 소멸자등을 통하여 반납을 해주고 종료되어야 한다.



댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
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
글 보관함