Namespaces
Variants

C++ named requirements: Mutex (since C++11)

From cppreference.net
C++ named requirements

Mutex 요구사항은 스레드 간 동기화를 포함하도록 Lockable 요구사항을 확장합니다.

목차

요구사항

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 타입의 예외가 발생할 수 있으며, 다음과 같은 에러 코드를 가집니다:
  • 다음 표현식 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)
동일 스레드에서 재귀적으로 잠글 수 있는 상호 배제 기능 제공
(class)
동일 스레드에서 재귀적으로 잠글 수 있는 상호 배제 기능 제공
타임아웃을 통한 잠금 구현
(class)
공유 상호 배제 기능 제공
(class)
공유 상호 배제 기능 제공 및 타임아웃을 통한 잠금 구현
(class)
타임아웃을 통한 잠금을 구현하는 상호 배제 기능 제공
(class)

결함 보고서

다음의 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.

DR 적용 대상 게시된 동작 올바른 동작
LWG 2309 C++11 lock std::system_error
std::errc::device_or_resource_busy
오류 코드와 함께 throw할 수 있음
허용되지 않음

참고 항목