[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." 메시지를 출력하고 종료되고


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


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




:

[C++11 Overview] mutex

Book Review 2013. 3. 11. 14:34

future 에 이어서 소개하고 있는 부분입니다.


아무래도 멀티 스레드니 병렬 처리니 하는 부분들이 나오면 필수적으로 따라 붙는 부분이


데이터의 접근에 대한 안전 장치겠지요.


다음은 전역 선언된 int 변수 하나를 두개의 스레드에서 증가/감소 하는 코드입니다.

이전에도 프로그래머들이 종종 만들어 쓰는 auto lock 과 유사한 모습입니다.


c++11 의 mutex 는 mutex , timed_mutex , recursive_mutex , recursive_timed_mutex 4 종이 제공되고 있고,

이름상에서 나타나듯이 쓰임새가 차이가 납니다.

재귀적인 lock 작업에 non-recursive mutex 를 사용하면 미정의 동작을 하게 된다고 하네요.

ps. 위 코드에서와 같은 간단한 변수의 증감은 mutex 보다는 atomic 을 사용하는 것이 더 효율적입니다.


:

[C++11 Overview] void future

Book Review 2013. 3. 11. 14:06

책에서 void 타입의 future 활용에 대해서 따로 언급을 하고 있는데요..


다른 특정 정보 보다는 함수가 끝나는 시점을 알고자 할 때 유용하다고 하고 있습니다.


그러면서 wait() 과 get() 의 사용 선택 기준에 대해서도 언급하고 있는데


예외 발생을 알기 위해서는 get 을 선택하고, future_status 의 timeout 을 얻을 필요가 있다면


wait 을 선택하라고 하고 있습니다. ( 이 부분은 future 활용의 경험이 없어서 그런지 잘 와닿지를 않네요. )


아무튼 timeout 값은 wait 멤버 함수를 통해서, 예외 발생의 캐치는 get 멤버 함수를 통해서만 얻을 수 있다는 점은


숙지해 두어야 겠습니다.

'Book Review' 카테고리의 다른 글

[C++11 Overview] RAII Classes for Mutexes  (0) 2013.03.11
[C++11 Overview] mutex  (0) 2013.03.11
[C++11 Overview] Uniform Initialization Syntax  (0) 2013.02.22
[C++11 Overview] Raw String Literals  (0) 2013.02.22
[C++11 Overview] Unicode Support  (0) 2013.02.18
: