[C++11 Overview] RAII Classes for Mutexes

Book Review 2013. 3. 11. 16:15

RAII ( Resource Acquisition In Initialization ) 은 리소스 할당과 해제에 대해서 


Bjarne StousStrup (C++ 창시자) 이 제안한 프로그래밍 방법론 입니다.


위키 참조 : Resource_Acquisition_Is_Initialization


RAII 에 대해서는 Channel 9 - Going Native 2012 에서도 Bjarne 자신이 직접


설명하고 있습니다. Keynote-Bjarne-Stroustrup-Cpp11-Style


아무튼 mutex 에 대한 RAII 클래스는 lock_guard 와 unique_lock 두 종류가 제공 되는데,


1. std::lock_guard


lock_quard 의 경우 별다른 추가적인 기능이 없는 대신 사용이 매우 간단하고 오버헤드도 적습니다.


기존에 프로그래머들이 곧잘 만들어 사용하던 auto lock 류들과 흡사합니다.


객체 생성 블럭구간에 lock 을 거는 것이죠.

lock_guard 는 copy 나 move 가 불가능하며 별도의 추가적인 기능은 없습니다.


2. std::unique_lock

unique_lock 의 경우에는 좀 더 유연한 제어 방법들을 제공합니다. (그 만큼 어느 정도 오버헤드는 따라 붙지만...)

timed mutex 를 사용하는 경우엔 unique_lock 을 사용하라고 하고 있습니다.

unique_lock 은 lock_guard 와 마찬가지로 copy 는 금지 되어있지만 move 는 가능합니다.

그리고 lock_guard 가 enclosing block 내에서 자동으로 락을 거는 것과 달리

객체 생성 이 후 락을 걸 수 있고 객체 소멸 이전에 락을 풀 수도 있습니다.

여기서 mutex 는 동일 코드를 재귀하기 때문에 recursive_timed_mutex 를 사용했고

lock 객체의 생성자에서 데드락이 걸리는 것을 방지 하기 위해 파라미터로 defer_lock 를 주었습니다.

위 코드를 실행 시키고 잠시 기다리면 처음 critical section 에 진입한 스레드 외에


나머지 스레드들은 "input timed out." 메시지를 출력하고 종료되고


한 스레드만 입력을 대기하고 있게 됩니다.


문자 하나를 입력해 주면 다으모가 같은 결과가 나오게 됩니다.




: