Namespaces
Variants

atomic_compare_exchange_weak, atomic_compare_exchange_strong, atomic_compare_exchange_weak_explicit, atomic_compare_exchange_strong_explicit

From cppreference.net
헤더 파일에 정의됨 <stdatomic.h>
_Bool atomic_compare_exchange_strong ( volatile A * obj,
C * expected, C desired ) ;
(1) (C11 이후)
_Bool atomic_compare_exchange_weak ( volatile A * obj,
C * expected, C desired ) ;
(2) (C11 이후)
_Bool atomic_compare_exchange_strong_explicit ( volatile A * obj,

C * expected, C desired,
memory_order succ,

memory_order fail ) ;
(3) (C11 이후)
_Bool atomic_compare_exchange_weak_explicit ( volatile A * obj,

C * expected, C desired,
memory_order succ,

memory_order fail ) ;
(4) (C11 이후)

obj 가 가리키는 메모리의 내용과 expected 가 가리키는 메모리의 내용을 원자적으로 비교하여, 비트 단위로 동일할 경우 전자를 desired 로 교체합니다(읽기-수정-쓰기 작업 수행). 그렇지 않을 경우, obj 가 가리키는 메모리의 실제 내용을 *expected 에 로드합니다(로드 작업 수행).

읽기-수정-쓰기 및 로드 연산에 대한 메모리 모델은 각각 succ fail 입니다. (1-2) 버전은 기본적으로 memory_order_seq_cst 를 사용합니다.

함수의 약한 형태((2)와 (4))는 가짜 실패(spuriously fail)가 허용됩니다. 즉, * obj ! = * expected 인 경우처럼 동작할 수 있습니다. compare-and-exchange 연산이 루프 내에 있을 때, 약한 버전은 일부 플랫폼에서 더 나은 성능을 제공합니다. 약한 compare-and-exchange가 루프를 필요로 하고 강한 버전이 그렇지 않은 경우에는 강한 버전이 더 바람직합니다.

이것은 모든 generic function 에 대해 정의된 atomic object types A 입니다. 인자는 volatile 및 비-volatile 원자 객체의 주소를 모두 수용하기 위해 volatile 원자 타입에 대한 포인터이며, volatile 원자 객체에 이 연산을 적용할 때 volatile 의미론이 유지됩니다. C A 에 해당하는 비-원자 타입입니다.

제네릭 함수의 이름이 매크로인지 외부 링크를 가진 식별자로 선언되었는지는 명시되지 않습니다. 실제 함수에 접근하기 위해 매크로 정의를 억제하는 경우(예: ( atomic_compare_exchange ) ( ... ) 와 같이 괄호로 묶은 경우), 또는 프로그램이 제네릭 함수의 이름으로 외부 식별자를 정의하는 경우, 그 동작은 정의되지 않습니다.

목차

매개변수

obj - 테스트 및 수정할 atomic 객체에 대한 포인터
expected - atomic 객체에서 발견될 것으로 예상되는 값에 대한 포인터
desired - 예상과 일치할 경우 atomic 객체에 저장할 값
succ - 비교가 성공할 경우 읽기-수정-쓰기 연산에 대한 메모리 동기화 순서. 모든 값이 허용됨.
fail - 비교가 실패할 경우 로드 연산에 대한 메모리 동기화 순서. memory_order_release 또는 memory_order_acq_rel 일 수 없으며 succ 보다 강한 순서를 지정할 수 없음

반환값

비교 결과: true *obj *exp 와 같았던 경우, false 는 그 외의 경우입니다.

참고 사항

atomic_compare_exchange_* 계열의 동작은 다음과 같이 원자적으로 실행된 것과 같습니다:

if (memcmp(obj, expected, sizeof *obj) == 0) {
    memcpy(obj, &desired, sizeof *obj);
    return true;
} else {
    memcpy(expected, obj, sizeof *obj);
    return false;
}

참고문헌

  • C17 표준 (ISO/IEC 9899:2018):
  • 7.17.7.4 atomic_compare_exchange 제네릭 함수 (p: 207)
  • C11 표준 (ISO/IEC 9899:2011):
  • 7.17.7.4 atomic_compare_exchange 제네릭 함수 (p: 283-284)

참고 항목

원자적 객체의 값과 값을 교환합니다
(함수)
C++ documentation for atomic_compare_exchange_weak , atomic_compare_exchange_strong , atomic_compare_exchange_weak_explicit , atomic_compare_exchange_strong_explicit