2018년 5월 21일 월요일

C++ 11/14 관련 내용 대충 정리, RAII

최신 C++을 공부하려 책을 보긴 했었는데
내용이 기존 문법과 함께 여기저기 흩어져 있어 보기에 좀 어려워
MSDN을 참고하여 대충 정리하려함.

C++11/14/17 기능에 대한 지원(최신 C++)
https://msdn.microsoft.com/ko-kr/library/hh567368.aspx


Resource Acquisition Is Initialization (RAII)

https://msdn.microsoft.com/ko-kr/library/hh438480.aspx

이미 많이 사용하는 거라..
정리까지는 필요 없겠지만, 위 페이지에는 자세한 내용이 없어서..

http://en.cppreference.com/w/cpp/language/raii
https://en.wikipedia.org/wiki/Resource_acquisition_is_initialization


- C++ 기술로써 resource 사용을 위한 획득, 제거를 개체의 life cycle에 맞춰 binding 하는 방법
 : resource의 예 :  allocated heap memory, thread of execution, open socket, open file, locked mutex, disk space, database connection—anything that exists in limited supply
- Resource는 class로 캡슐화됨
 : 생성자에서 resource를 획득하고  RAII instance가 생성되거나 예외를 발생 시킨다.
 : 소멸자에서 resoruce를 해제하되 예외를 발생시키지는 않음.
- Resource는 RAII class를 통해 사용되며 RAII instance의 lifetime 동안 사용 가능함.
- RAII는 개체를 사용할 동안 resource를 접근하는 것과 개체가 소멸될 때 획득한 resource는 해제됨을 보장


std::mutex m;
 
void bad() 
{
    m.lock();                    // acquire the mutex
    f();                         // if f() throws an exception, the mutex is never released
    if(!everything_ok()) return; // early return, the mutex is never released
    m.unlock();                  // if bad() reaches this statement, the mutex is released
}
 
void good()
{
    std::lock_guard<std::mutex> lk(m); // RAII class: mutex acquisition is initialization
    f();                               // if f() throws an exception, the mutex is released
    if(!everything_ok()) return;       // early return, the mutex is released
}                                      // if g

- C++ library class는 각기 자신들의 생성자, 소멸자를 통해 resource를 관리함 (std::string, std::vector, std::thread)
- C++ library class는 RAII wrapper를 제공함
 : std::unique_ptr, std::shared_ptr : 동적으로 생성된 memory를 관리
 : std::lock_guard, std::unique_lock, std::shared_lock : mutex 관리


댓글 없음:

댓글 쓰기