Namespaces
Variants

std::experimental::atomic_shared_ptr<T>:: compare_exchange_strong, std::experimental::atomic_shared_ptr<T>:: compare_exchange_weak

From cppreference.net
bool compare_exchange_weak ( std:: shared_ptr < T > & expected, const std:: shared_ptr < T > & desired,
std:: memory_order success, std:: memory_order failure ) noexcept ;
(1)
bool compare_exchange_weak ( std:: shared_ptr < T > & expected, std:: shared_ptr < T > && desired,
std:: memory_order success, std:: memory_order failure ) noexcept ;
(2)
bool compare_exchange_weak ( std:: shared_ptr < T > & expected, const std:: shared_ptr < T > & desired,
std:: memory_order order = std:: memory_order_seq_cst ) noexcept ;
(3)
bool compare_exchange_weak ( std:: shared_ptr < T > & expected, std:: shared_ptr < T > && desired,
std:: memory_order order = std:: memory_order_seq_cst ) noexcept ;
(4)
bool compare_exchange_strong ( std:: shared_ptr < T > & expected, const std:: shared_ptr < T > & desired,
std:: memory_order success, std:: memory_order failure ) noexcept ;
(5)
bool compare_exchange_strong ( std:: shared_ptr < T > & expected, std:: shared_ptr < T > && desired,
std:: memory_order success, std:: memory_order failure ) noexcept ;
(6)
bool compare_exchange_strong ( std:: shared_ptr < T > & expected, const std:: shared_ptr < T > & desired,
std:: memory_order order = std:: memory_order_seq_cst ) noexcept ;
(7)
bool compare_exchange_strong ( std:: shared_ptr < T > & expected, std:: shared_ptr < T > && desired,
std:: memory_order order = std:: memory_order_seq_cst ) noexcept ;
(8)

내부의 shared_ptr 을 원자적으로 * this expected 와 비교하여 동등한 경우, 전자를 desired 로 대체합니다(읽기-수정-쓰기 작업 수행). 그렇지 않으면 * this 에 저장된 실제 값을 expected 에 로드합니다(로드 작업 수행). 대체 작업은 shared_ptr 의 복사 또는 이동 할당 연산자를 통해 적절하게 수행됩니다.

shared_ptr 은 동일한 포인터 값을 저장하고 소유권을 공유하는 경우에만 동등합니다.

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

약한 버전 (1-4) 은 가끔 잘못된 결과를 반환할 수 있습니다.

목차

매개변수

expected - 원자적 객체에서 발견될 것으로 예상되는 값에 대한 참조
desired - 예상과 일치할 경우 원자적 객체에 저장할 값
success - 비교가 성공할 경우 읽기-수정-쓰기 연산에 대한 메모리 동기화 순서. 모든 값이 허용됨
failure - 비교가 실패할 경우 로드 연산에 대한 메모리 동기화 순서. std::memory_order_release 또는 std::memory_order_acq_rel 일 수 없으며, success 보다 강한 순서를 지정할 수 없음
order - 두 연산 모두에 대한 메모리 동기화 순서

반환값

true 기본 원자 값이 변경된 경우, false 그렇지 않은 경우.

비고

atomic_shared_ptr 객체 자체에 대한 모든 변경사항과 관련된 모든 use_count 증가는 원자적으로 수행됨이 보장됩니다. 관련된 use_count 감소는 원자적 연산 이후에 발생하지만, 그 연산의 일부일 필요는 없습니다. 관련된 모든 소멸 또는 할당 해제 연산은 원자적 연산 이후에 발생하며 그 연산의 일부가 아닙니다.

compare-exchange 연산이 true 를 반환하면, expected 는 원자적 업데이트 단계 이후에 접근되지 않습니다. 만약 false 를 반환하면, expected 는 시도된 원자적 업데이트에서 atomic_shared_ptr 객체로부터 읽은 기존 값으로 업데이트됩니다. expected 에 대한 쓰기에 해당하는 use_count 업데이트는 원자적 연산의 일부이지만, expected 자체에 대한 쓰기는 원자적 연산의 일부일 필요가 없습니다.

오버로드 (1,3,5,7) 의 경우, desired 는 원자적 업데이트 단계 이후에 접근되지 않습니다.

오버로드 (2,4,6,8) 의 경우, desired 는 compare-exchange 연산이 true 를 반환할 때만 이동됩니다; 이동은 원자적 업데이트 단계 이후에 발생합니다.

참고 사항

함수의 약한 형태 (1-4) 는 허위 실패(spuriously fail)할 수 있습니다. 즉, * this expected 가 실제로 동등한 경우에도 동등하지 않은 것처럼 동작할 수 있습니다. 비교-교환(compare-and-exchange) 연산이 루프 내에서 사용될 때, 일부 플랫폼에서는 약한 버전이 더 나은 성능을 제공합니다.

참고 항목

std::shared_ptr 에 대한 원자적 연산을 특수화합니다
(함수 템플릿)