C++ named requirements: Mutex (since C++11)
From cppreference.net
Mutex 요구사항은 스레드 간 동기화를 포함하도록 Lockable 요구사항을 확장합니다.
목차 |
요구사항
- Lockable
- DefaultConstructible
- Destructible
- 복사 불가능
- 이동 불가능
m
객체가
Mutex
타입일 때:
- 다음 표현식 m. lock ( ) 은 다음과 같은 특성을 가집니다
-
- 원자적 연산으로 동작합니다.
- 뮤텍스의 배타적 소유권을 얻을 때까지 호출 스레드를 차단합니다.
- 동일한 뮤텍스에 대한 이전 m. unlock ( ) 연산들이 이 lock 연산과 synchronize-with 관계를 가집니다 (release-acquire std::memory_order 와 동등합니다).
- 호출 스레드가 이미 뮤텍스를 소유하고 있는 경우 동작은 정의되지 않습니다 (단, m이 std::recursive_mutex 또는 std::recursive_timed_mutex 인 경우는 예외입니다).
- 오류 발생 시 std::system_error 타입의 예외가 발생할 수 있으며, 다음과 같은 에러 코드를 가집니다:
-
- std::errc::operation_not_permitted - 호출 스레드가 필요한 권한을 가지고 있지 않은 경우
- std::errc::resource_deadlock_would_occur - 구현체가 이 연산이 데드락을 유발할 것이라고 감지한 경우
- 다음 표현식 m. try_lock ( ) 은 다음과 같은 특성을 가집니다
-
- 원자적 연산으로 동작합니다.
- 호출 스레드가 뮤텍스의 배타적 소유권을 획득하려고 시도하며, 블로킹하지 않습니다. 소유권을 획득하지 못할 경우 즉시 반환합니다. 이 함수는 현재 다른 스레드가 뮤텍스를 소유하고 있지 않은 경우에도 허위 실패하고 반환될 수 있습니다.
-
try_lock()이 성공하면, 동일 객체에 대한 이전unlock()연산들이 이 연산과 동기화됩니다 (release-acquire std::memory_order 와 동등함).lock()은 실패한try_lock()과는 동기화되지 않습니다. - 예외를 발생시키지 않습니다.
- 다음 표현식 m. unlock ( ) 은 다음과 같은 속성을 가집니다
-
- 원자적 연산(atomic operation)으로 동작합니다.
- 호출 스레드의 뮤텍스 소유권을 해제하고 동일한 객체에 대한 후속 성공적인 lock 작업과 동기화(synchronizes-with) 합니다.
- 호출 스레드가 뮤텍스를 소유하지 않은 경우 동작은 정의되지 않습니다(undefined behavior).
- 예외를 발생시키지 않습니다.
- 단일 뮤텍스에 대한 모든 잠금 및 잠금 해제 작업은 modification order 로 볼 수 있는 단일 전체 순서로 발생합니다: 이 순서는 해당 개별 뮤텍스에 특정됩니다.
표준 라이브러리
다음 표준 라이브러리 타입들은 Mutex 요구사항을 충족합니다:
|
(C++11)
|
기본 상호 배제 기능 제공
(class) |
|
(C++11)
|
동일 스레드에서 재귀적으로 잠글 수 있는 상호 배제 기능 제공
(class) |
|
(C++11)
|
동일 스레드에서 재귀적으로 잠글 수 있는 상호 배제 기능 제공
타임아웃을 통한 잠금 구현 (class) |
|
(C++17)
|
공유 상호 배제 기능 제공
(class) |
|
(C++14)
|
공유 상호 배제 기능 제공 및 타임아웃을 통한 잠금 구현
(class) |
|
(C++11)
|
타임아웃을 통한 잠금을 구현하는 상호 배제 기능 제공
(class) |
결함 보고서
다음의 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.
| DR | 적용 대상 | 게시된 동작 | 올바른 동작 |
|---|---|---|---|
| LWG 2309 | C++11 |
lock
이
std::system_error
를 std::errc::device_or_resource_busy 오류 코드와 함께 throw할 수 있음 |
허용되지 않음 |