안녕하세요,
재재입니다.
이번 포스팅에서는,
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 의 종류에 따른 활용 방식은 확실히 다릅니다.
용도를 정확하게 이해하고 그에 맞는 안전한 코드를 작성하기 위해서는,
반드시 알아야 하는 내용입니다.