shared_timed_mutex

shared_timed_mutex (공유 시간 제한 뮤텍스)

shared_timed_mutex는 여러 스레드가 공유 데이터에 동시에 접근하는 것을 보호하기 위해 사용하는 동기화 기본 요소예요. 일반 뮤텍스가 배타적 접근만 제공하는 반면, shared_timed_mutex는 배타적 소유권과 공유 소유권이라는 두 가지 접근 수준을 제공해요. 여러 읽기 스레드가 동시에 자원에 접근해도 데이터 경쟁이 발생하지 않지만, 쓰기 스레드는 하나만 허용해야 하는 상황에서 주로 사용해요.

출처: cppreference

본문

shared_timed_mutex 클래스는 <shared_mutex> 헤더에 정의되어 있으며, C++14부터 사용할 수 있어요.

<shared_mutex> 헤더에 정의됨
class shared_timed_mutex; (C++14부터)

timed_mutex와 유사하게 shared_timed_mutextry_lock_for(), try_lock_until(), try_lock_shared_for(), try_lock_shared_until() 멤버 함수를 통해 시간 제한을 두고 소유권 획득을 시도할 수 있어요.

shared_timed_mutex 클래스는 SharedTimedMutexStandardLayoutType의 모든 요구 사항을 충족해요.

멤버 함수

(constructor) 뮤텍스를 생성해요 (공개 멤버 함수)
(destructor) 뮤텍스를 소멸해요 (공개 멤버 함수)
operator= [deleted] 복사 대입이 불가능해요 (공개 멤버 함수)

배타적 잠금 (Exclusive locking)

lock 뮤텍스를 잠가요. 뮤텍스를 사용할 수 없으면 블록돼요 (공개 멤버 함수)
try_lock 뮤텍스 잠금을 시도해요. 뮤텍스를 사용할 수 없으면 바로 반환해요 (공개 멤버 함수)
try_lock_for 뮤텍스 잠금을 시도해요. 지정한 시간 제한 동안 뮤텍스를 사용할 수 없으면 반환해요 (공개 멤버 함수)
try_lock_until 뮤텍스 잠금을 시도해요. 지정한 시각까지 뮤텍스를 사용할 수 없으면 반환해요 (공개 멤버 함수)
unlock 뮤텍스 잠금을 해제해요 (공개 멤버 함수)

공유 잠금 (Shared locking)

lock_shared 공유 소유권을 위해 뮤텍스를 잠가요. 뮤텍스를 사용할 수 없으면 블록돼요 (공개 멤버 함수)
try_lock_shared 공유 소유권을 위해 뮤텍스 잠금을 시도해요. 뮤텍스를 사용할 수 없으면 바로 반환해요 (공개 멤버 함수)
try_lock_shared_for 공유 소유권을 위해 뮤텍스 잠금을 시도해요. 지정한 시간 제한 동안 뮤텍스를 사용할 수 없으면 반환해요 (공개 멤버 함수)
try_lock_shared_until 공유 소유권을 위해 뮤텍스 잠금을 시도해요. 지정한 시각까지 뮤텍스를 사용할 수 없으면 반환해요 (공개 멤버 함수)
unlock_shared 공유 소유권의 뮤텍스 잠금을 해제해요 (공개 멤버 함수)

참고 사항 (Notes)

Feature-test macro Value Std Feature
__cpp_lib_shared_timed_mutex 201402L (C++14) std::shared_timed_mutex

예제 (Example)

이 섹션은 불완전해요. 동기를 부여하는 예제를 구성해야 해요.

여러 읽기 스레드를 허용하지만 쓰기 스레드는 하나만 허용하는 자원을 보유한 클래스의 복사 대입 연산자예요.

#include <mutex>
#include <shared_mutex>

class R
{
    mutable std::shared_timed_mutex mut;
    /* data */
public:
    R& operator=(const R& other)
    {
        // requires exclusive ownership to write to *this
        std::unique_lock<std::shared_timed_mutex> lhs(mut, std::defer_lock);
        // requires shared ownership to read from other
        std::shared_lock<std::shared_timed_mutex> rhs(other.mut, std::defer_lock);
        std::lock(lhs, rhs);
        /* assign data */
        return *this;
    }
};

int main()
{
    R r;
}

더 알아보기 (Learn more)

cppreference