std:: atomic_ref
|
헤더에 정의됨
<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:: is_trivially_copyable_v < T > 가 false 인 경우.
-
is_always_lock_free가 false 이고 std:: is_volatile_v < T > 가 true 인 경우.
std::atomic_ref
는
CopyConstructible
입니다.
목차 |
중첩 타입
| 유형 | 정의 |
value_type
|
std:: remove_cv_t < T > |
difference_type
|
|
데이터 멤버
| 멤버 | 설명 |
T
*
ptr
|
참조된 객체를 가리키는 포인터
( 설명 전용 멤버 객체* ) |
|
[static]
|
해당 타입이 항상 락-프리임을 나타냄
(공개 정적 멤버 상수) |
|
[static]
|
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) |
다음 경우에만 제공됨:
|
|
|
참조된 객체에 저장된 값에 인자를 원자적으로 더하고 이전에 보유한 값을 획득합니다
(public member function) |
|
|
참조된 객체에 저장된 값에서 인자를 원자적으로 빼고 이전에 보유한 값을 얻습니다
(public member function) |
|
|
참조된 값에 원자적으로 더하거나 빼기
(public member function) |
|
다음 경우에만 제공됨:
|
|
|
(C++26)
|
인자와 참조된 객체의 값 사이에서
std::max
를 원자적으로 수행하고 이전에 보유한 값을 획득합니다
(public member function) |
|
(C++26)
|
인자와 참조된 객체의 값 사이에
std::min
을 원자적으로 수행하고 이전에 보유한 값을 획득합니다
(public member function) |
|
참조된 객체를 원자적으로 1씩 증가 또는 감소시킵니다
(public member function) |
|
|
|
|
인수와 참조된 객체의 값 사이에 비트 단위 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 */
|
(3) | (C++20부터) |
참고 사항
구현체는 지정된 특수화를 병합할 수 있습니다. 예를 들어 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 클래스 템플릿과 특수화
(클래스 템플릿) |