안녕하세요,
재재입니다.

이번 포스팅에서는,
c++ mutex 종류별 특징을 다룹니다.

설명하기 전 같이 보면 좋은 포스팅 추천 드립니다.

(1) c++ mutex

기본적으로 가장 많이 사용하는 mutex 입니다.
lock 과 unlock 을 지원하며 하나의 스레드에서 점유 하고 있으면,
다른 스레드에서 점유할 수 없습니다.

(2) c++ std::recursive_mutex

c++ std::recursive_mutex 는,
mutex 와는 달리 하나의 스레드에서 점유하고 있어도,
다른 스레드에서도 다시 진입 할 수 있습니다.
(recursive_mutex 활용 예시)

특히 재귀함수 구조에서 주로 사용됩니다.
주로 class 멤버 변수로 많이 사용하는 편입니다.

... 
// class ...
std::recursive_mutex rmutex;
...
void RecursiveFunction() {
    std::lock_guard<std::recursive_mutex> recursive_lock(rmutex);
}

https://en.cppreference.com/w/cpp/thread/recursive_mutex

(3) c++ std::shared_mutex

std::shared_mutex 는 c++ mutex 종류 중 거의 유일하게,
(shared_mutex 활용 예시)
읽기 및 쓰기를 동시에 지원하는 mutex 입니다.

대체로 resource를 읽는 동작은 여러 군데서 가능하며,
반대로 쓰는 동작은 주로 하나를 사용하기 때문에 아래와 같은 방식으로 사용됩니다.

void ResourceReadFunction() {
    // multiple reads
    std::shared_lock<std::shared_mutex> read_lock(share_mutxx);
}
void ResourceWriteFunction() {
    // unique write
    std::unique_lock<std::shared_mutex> write_lock(share_mutxx);
}

https://en.cppreference.com/w/cpp/thread/shared_mutex

(4) c++ timed_mutex

c++ std::timed_mutex 은,
시간제한을 두고 사용 할 수 있는 mutex 입니다.

일정 시간동안 lock 을 취할 수 있도록 하며,
시간초과의 경우 실패할 수 있습니다.

대체로 아래와 같은 방식으로 사용됩니다.

{
    std::unique_lock<std::timed_mutex> time_lock(time_mutex);
    if (time_lock.try_lock_for(duration)) {
        // success
    } else {
        // fail
    }
}

https://en.cppreference.com/w/cpp/thread/timed_mutex

(5) 결론

c++ 에서 사용하는 mutex 의 종류에 따른 활용 방식은 확실히 다릅니다.
용도를 정확하게 이해하고 그에 맞는 안전한 코드를 작성하기 위해서는,
반드시 알아야 하는 내용입니다.

c++ mutex 종류별 특징
태그:                     

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다