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_mutex는 try_lock_for(), try_lock_until(), try_lock_shared_for(), try_lock_shared_until() 멤버 함수를 통해 시간 제한을 두고 소유권 획득을 시도할 수 있어요.
shared_timed_mutex 클래스는 SharedTimedMutex 및 StandardLayoutType의 모든 요구 사항을 충족해요.
멤버 함수
| (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;
}