std::experimental::atomic_shared_ptr<T>:: compare_exchange_strong, std::experimental::atomic_shared_ptr<T>:: compare_exchange_weak
|
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
에 대한 원자적 연산을 특수화합니다
(함수 템플릿) |