'scoped_lock'에 해당되는 글 1건

  1. 2008.08.25 [Idioms] Resource Acquisition Is Initialization
2008. 8. 25. 10:46

[Idioms] Resource Acquisition Is Initialization

Resource Acquisition Is Initialization(RAII)

- 스코크의 끝에서 자원을 해제를 보장해준다.
-
예외등에서 안전한 해제를 보장해 줄수 있다

동기

- scope(function 또는 function내에서 {} 로 지정된)내에서 new, object locking,file open등과 같은 자원들을 생성한 이후, function내에서 복잡한 분기 후 종료, 예외(exception)등에서 자원을 해제하기가 쉽지 않고, 쉽게 실수 할수 있다. Mutexsemapore같은 동기화 오브젝트의 사용에 있어서는 어플리케이션에 심각한 Dead Lock이 발생할수도 있다.

example)

void foo ()

{

  char * ch = new char [100];

  if (...)

     if (...)

        return;

     else if (...)

            if (...)

  else

     throw "ERROR";

 

  delete [] ch; // 여기에 오지 않으면 Memory leak이 발생한다.

}

void bar ()

{

  lock.acquire();

  if (...)

     if (...)

        return;

  else

     throw "ERROR";

 

  lock.release(); // 여기에 오지 않으면 Dead lock이 발생한다.

}

 

해결방법

scope내에 클래스의 생성자에서 자원을 생성하고, 소멸자에서 자원의 해제를 하게 한다.

 

scope내에서 생성된 Object는 콜스택에 저장이 되고, scope가 종료되면서(exception이 발생했을때도 마찬가지) 소멸자가 호출되는 것을 이용해서 쉽고 편하게 자원 해제를 할수 있으며, 자원 해제의 시점도 조절할수 있다.

Comment

프로젝트 진행시 아마 가장 많이 사용되는 Idiom중의 하나 일거 같다.  아마 이름이나 내용을 모르고도 사용하는 개발자도 많을거라 생각된다.(나도 그랬다.... ;;) 하긴, 모든 Idiom들이 다 그렇치머...
 

알려진 사용 예

-       std::auto_ptr()

-       boost::scoped_ptr

-       boost::mutex::scoped_lock

 

관련된 Idioms

-       Scope Guard (RAII에서 자원의 Release를 사용자가 정할수 있고, 이에 대한 flag를 둠으로서 안전한 자원 해제를 보장하는 방법)

-       Reference Counting( boost::shared_ptr()같이 참조 카운트를 이용한 SmartPtr의 종료 용례를 얘기한거 같은데, 확인해 보니 맞는거 같다. Boost::shared_ptr, std::tr1:;shared_ptr)

-       Scoped Locking(RAII에서 Mutex, Semapore같은 동기화 오브젝트에서만 한정된다)

 

More C++ Idioms 참고