Namespaces
Variants

std:: atomic_ref

From cppreference.net
Concurrency support library
Threads
(C++11)
(C++20)
this_thread namespace
(C++11)
(C++11)
Cooperative cancellation
Mutual exclusion
Generic lock management
Condition variables
(C++11)
Semaphores
Latches and Barriers
(C++20)
(C++20)
Futures
(C++11)
(C++11)
(C++11)
Safe reclamation
Hazard pointers
Atomic types
(C++11)
atomic_ref
(C++20)
Initialization of atomic types
(C++11) (deprecated in C++20)
(C++11) (deprecated in C++20)
Memory ordering
(C++11) (deprecated in C++26)
Free functions for atomic operations
Free functions for atomic flags
헤더에 정의됨 <atomic>
template < class T >
struct atomic_ref ;
(C++20부터)

std::atomic_ref 클래스 템플릿은 참조하는 객체에 원자적 연산을 적용합니다.

std::atomic_ref 객체의 수명 동안, 이 객체가 참조하는 대상은 원자적 객체로 간주됩니다. 한 스레드가 원자적 객체에 쓰는 동안 다른 스레드가 이를 읽는 경우, 그 동작은 명확히 정의됩니다 (데이터 레이스에 대한 자세한 내용은 메모리 모델 참조). 또한, 원자적 객체에 대한 접근은 스레드 간 동기화를 설정하고 std::memory_order 에 지정된 대로 비원자적 메모리 접근의 순서를 정할 수 있습니다.

객체의 수명은 해당 객체를 참조하는 모든 std::atomic_ref 의 수명을 초과해야 합니다. 객체를 참조하는 std::atomic_ref 인스턴스가 존재하는 동안, 해당 객체는 반드시 이러한 std::atomic_ref 인스턴스를 통해서만 독점적으로 접근되어야 합니다. std::atomic_ref 객체에 의해 참조되는 객체의 하위 객체는 다른 std::atomic_ref 객체에 의해 동시에 참조되어서는 안 됩니다.

객체에 적용된 원자 연산들은 std::atomic_ref 를 통해 동일한 객체를 참조하는 다른 std::atomic_ref 를 통해 적용된 원자 연산들과 상대적으로 원자적입니다.

핵심 언어의 참조 와 마찬가지로, std::atomic_ref 에 대한 constness는 얕습니다 - const std::atomic_ref 객체를 통해 참조된 값을 수정하는 것이 가능합니다.

다음 조건 중 하나라도 충족되면 프로그램의 형식이 잘못되었습니다:

std::atomic_ref CopyConstructible 입니다.

목차

중첩 타입

유형 정의
value_type std:: remove_cv_t < T >
difference_type
  • value_type , T cv bool 이 아닌 산술 타입인 경우
  • 그렇지 않으면, std::ptrdiff_t , T 가 객체 포인터 타입인 경우
  • 그렇지 않으면, 정의되지 않음

데이터 멤버

멤버 설명
T * ptr 참조된 객체를 가리키는 포인터
( 설명 전용 멤버 객체* )
해당 타입이 항상 락-프리임을 나타냄
(공개 정적 멤버 상수)
atomic_ref 에 의해 참조될 객체의 필요 정렬을 나타냄
(공개 정적 멤버 상수)

멤버 함수

atomic_ref 객체를 생성합니다
(public member function)
atomic_ref 객체가 참조하는 객체에 값을 저장합니다
(public member function)
atomic_ref 객체가 잠금 없는 방식인지 확인합니다
(public member function)
참조된 객체의 값을 비원자적 인수로 원자적으로 대체합니다
(public member function)
참조된 객체의 값을 원자적으로 획득합니다
(public member function)
참조된 객체로부터 값을 로드합니다
(public member function)
참조된 객체의 값을 원자적으로 교체하고 이전에 보유한 값을 획득합니다
(public member function)
참조된 객체의 값을 비-원자적 인자와 원자적으로 비교하고, 같으면 원자적 교환을 수행하거나 다르면 원자적 로드를 수행합니다
(public member function)
스레드를 차단하여 알림을 받고 원자적 값이 변경될 때까지 대기합니다
(public member function)
원자적 객체를 대기 중인 스레드 중 최소 하나에 알림
(public member function)
원자적 객체를 대기 중인 모든 스레드에 알림
(public member function)
(C++26)
객체의 주소를 반환합니다
(public member function)
다음 경우에만 제공됨: T cv bool 이 아닌 산술 타입이거나 객체 포인터 타입인 경우
참조된 객체에 저장된 값에 인자를 원자적으로 더하고 이전에 보유한 값을 획득합니다
(public member function)
참조된 객체에 저장된 값에서 인자를 원자적으로 빼고 이전에 보유한 값을 얻습니다
(public member function)
참조된 값에 원자적으로 더하거나 빼기
(public member function)
다음 경우에만 제공됨: T cv bool 또는 객체 포인터 타입이 아닌 정수형 타입인 경우
(C++26)
인자와 참조된 객체의 값 사이에서 std::max 를 원자적으로 수행하고 이전에 보유한 값을 획득합니다
(public member function)
(C++26)
인자와 참조된 객체의 값 사이에 std::min 을 원자적으로 수행하고 이전에 보유한 값을 획득합니다
(public member function)
참조된 객체를 원자적으로 1씩 증가 또는 감소시킵니다
(public member function)
T cv bool 이 아닌 정수형(integral type)인 경우에만 제공됨
인수와 참조된 객체의 값 사이에 비트 단위 AND를 원자적으로 수행하고 이전에 보유한 값을 획득합니다
(public member function)
인자와 참조된 객체의 값 사이에 비트 OR 연산을 원자적으로 수행하고 이전에 보유한 값을 획득합니다
(public member function)
참조된 객체의 값과 인자 간에 비트별 XOR 연산을 원자적으로 수행하고 이전에 보유한 값을 획득합니다
(public member function)
참조된 값에 대해 비트 AND, OR, XOR 연산을 원자적으로 수행합니다
(public member function)

특수화

표준은 std::atomic_ref 가 다음과 같은 특수화를 가짐을 명시합니다:

template <>
struct atomic_ref < /*integral-type*/ > ;
(1) (C++20부터)
template <>
struct atomic_ref < /*floating-point-type*/ > ;
(2) (C++20부터)
template < class /*pointer-type*/ >

requires /* see below */

struct atomic_ref < /*pointer-type*/ > ;
(3) (C++20부터)
1) /*integral-type*/ cv bool 이외의 가능한 cv 한정자를 가진 정수형 타입을 나타냅니다.
2) /*floating-point-type*/ 는 가능한 cv 한정자가 붙은 부동소수점 타입을 나타냅니다.
3) 부분 특수화는 가능한 cv 한정자를 가진 객체 포인터 타입인 /*pointer-type*/ 타입에 대해 제공됩니다.

참고 사항

구현체는 지정된 특수화를 병합할 수 있습니다. 예를 들어 MSVC STL은 이들을 모두 기본 템플릿으로 병합합니다.

T cv void 또는 함수 타입일 때, std :: atomic_ref < T * > (즉 std :: atomic_ref < void * > , std :: atomic_ref < int ( * ) ( ) > 등)는 difference_type 또는 포인터 산술 연산을 필요로 하는 어떤 연산도 가지지 않습니다 또는 관계형 비교 (C++26부터) .

기능 테스트 매크로 표준 기능
__cpp_lib_atomic_ref 201806L (C++20) std::atomic_ref
__cpp_lib_constexpr_atomic 202411L (C++26) constexpr std::atomic std::atomic_ref

결함 보고서

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

DR 적용 대상 게시된 동작 올바른 동작
LWG 3508
( P3323R1 )
C++20 atomic_ref < T > 는 구현 불가능한 연산들을 가지고 있었음
만약 T const 타입이거나 비객체 포인터 타입인 경우
이러한 연산들은 제약되거나
부적합한 T 에 대해 제공되지 않음

참고 항목

(C++11)
bool, 정수형, 부동소수점, (C++20부터) 및 포인터 타입에 대한 atomic 클래스 템플릿과 특수화
(클래스 템플릿)