Namespaces
Variants

std::atomic_ref<T>:: compare_exchange_weak, std::atomic_ref<T>:: compare_exchange_strong

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)
(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
bool compare_exchange_weak

( value_type & expected, value_type desired,
std:: memory_order success,

std:: memory_order failure ) const noexcept ;
(1) (C++26부터 constexpr)
bool compare_exchange_weak

( value_type & expected, value_type desired,
std:: memory_order order =

std:: memory_order_seq_cst ) const noexcept ;
(2) (C++26부터 constexpr)
bool compare_exchange_strong

( value_type & expected, value_type desired,
std:: memory_order success,

std:: memory_order failure ) const noexcept ;
(3) (C++26부터 constexpr)
bool compare_exchange_strong

( value_type & expected, value_type desired,
std:: memory_order order =

std:: memory_order_seq_cst ) const noexcept ;
(4) (C++26부터 constexpr)

참조된 객체의 값 표현 expected 의 값 표현과 원자적으로 비교하여, 비트 단위로 동일할 경우 전자를 desired 로 대체합니다(읽기-수정-쓰기 작업 수행). 그렇지 않을 경우, 참조된 객체에 저장된 실제 값을 expected 에 로드합니다(로드 작업 수행).

1,3) 읽기-수정-쓰기 및 로드 연산에 대한 메모리 모델은 각각 success failure 입니다.
2,4) order 는 읽기-수정-쓰기와 로드 연산 모두에 사용되지만, std:: memory_order_acquire std:: memory_order_relaxed 가 각각 로드 연산에 사용되는 경우는 order std:: memory_order_acq_rel 이거나 std:: memory_order_release 인 경우입니다.

이러한 오버로드는 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 만 허용하도록 제한됨

예제