std::atomic_ref<T>:: compare_exchange_weak, std::atomic_ref<T>:: compare_exchange_strong
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Member functions | ||||
|
atomic_ref::compare_exchange_strong
atomic_ref::compare_exchange_weak
|
||||
|
(C++26)
|
||||
|
Operations for arithmetic types
(except
bool
and pointer-to-object)
|
||||
|
Operations for integral types
(except
bool
and pointer-to-object)
|
||||
|
(C++26)
|
||||
|
(C++26)
|
||||
|
Operations for integral types
(except
bool
)
|
||||
| Constants | ||||
|
bool
compare_exchange_weak
(
value_type
&
expected, value_type desired,
|
(1) | (C++26부터 constexpr) |
|
bool
compare_exchange_weak
(
value_type
&
expected, value_type desired,
|
(2) | (C++26부터 constexpr) |
|
bool
compare_exchange_strong
(
value_type
&
expected, value_type desired,
|
(3) | (C++26부터 constexpr) |
|
bool
compare_exchange_strong
(
value_type
&
expected, value_type desired,
|
(4) | (C++26부터 constexpr) |
참조된 객체의 값 표현 을 expected 의 값 표현과 원자적으로 비교하여, 비트 단위로 동일할 경우 전자를 desired 로 대체합니다(읽기-수정-쓰기 작업 수행). 그렇지 않을 경우, 참조된 객체에 저장된 실제 값을 expected 에 로드합니다(로드 작업 수행).
이러한 오버로드는 std:: is_const_v < T > 가 false 인 경우에만 오버로드 해결에 참여합니다.
만약 failure 가 std:: memory_order_relaxed , std:: memory_order_consume , std:: memory_order_acquire 또는 std:: memory_order_seq_cst 가 아닌 경우, 동작은 정의되지 않습니다.
목차 |
매개변수
| expected | - |
atomic_ref
객체가 참조하는 객체에서 발견될 것으로 예상되는 값에 대한 참조
|
| desired | - | 예상 값과 일치할 경우 참조 객체에 저장할 값 |
| success | - | 비교가 성공할 경우 읽기-수정-쓰기 작업에 대한 메모리 동기화 순서 |
| failure | - | 비교가 실패할 경우 로드 작업에 대한 메모리 동기화 순서 |
| order | - | 두 작업 모두에 대한 메모리 동기화 순서 |
반환값
true 참조된 객체가 성공적으로 변경된 경우, false 그렇지 않은 경우.
참고 사항
비교 및 복사는 비트 단위로 수행됩니다( std::memcmp 및 std::memcpy 와 유사함); 생성자, 할당 연산자 또는 비교 연산자가 사용되지 않습니다.
약한 형태 (1,2) 의 함수들은 가짜 실패를 허용합니다. 즉, * this ! = expected 인 경우에도 동일한 경우처럼 동작할 수 있습니다. compare-and-exchange 연산이 루프 내에 있을 때, 약한 버전은 일부 플랫폼에서 더 나은 성능을 제공합니다.
약한 비교-교환(compare-and-exchange)이 루프를 필요로 하고 강한 비교-교환은 그렇지 않을 경우,
value_type
의 객체 표현에 트랩 비트(trap bits)가 포함될 수 있거나 동일한 값에 대해 여러 객체 표현이 존재하는 경우(예: 부동 소수점 NaN)를 제외하고는 강한 비교-교환이 바람직합니다. 이러한 경우에는 약한 비교-교환이 일반적으로 안정적인 객체 표현으로 빠르게 수렴하기 때문에 효과적으로 작동합니다.
일부 멤버의 값 표현에는 참여하지만 다른 멤버의 값 표현에는 참여하지 않는 비트를 가진 union의 경우, 이러한 패딩 비트들이 활성 멤버의 값 표현에 참여하지 않을 때는 불확정 값을 가지므로 compare-and-exchange 연산이 항상 실패할 수 있습니다.
객체의 값 표현에 절대 참여하지 않는 패딩 비트는 무시됩니다.
결함 보고서
다음 동작 변경 결함 보고서는 이전에 게시된 C++ 표준에 소급 적용되었습니다.
| DR | 적용 대상 | 게시된 동작 | 올바른 동작 |
|---|---|---|---|
|
LWG 3508
( P3323R1 ) |
C++20 |
compare_exchange_weak
와
compare_exchange_strong
이 const T 에 대해 무의미했음 |
비-const
T
만 허용하도록 제한됨
|
예제
|
이 섹션은 불완전합니다
이유: 예제가 없음 |