std:: atomic <std::shared_ptr>
|
헤더에 정의됨
<memory>
|
||
|
template
<
class
T
>
struct std:: atomic < std:: shared_ptr < T >> ; |
(C++20부터) | |
std::atomic
의 부분 템플릿 특수화가
std::
shared_ptr
<
T
>
에 대해 제공되며, 이를 통해 사용자는
shared_ptr
객체를 원자적으로 조작할 수 있습니다.
여러 실행 스레드가 동기화 없이 동일한 std::shared_ptr 객체에 접근하고, 이들 접근 중 하나라도 shared_ptr 의 비상수 멤버 함수를 사용하는 경우, std:: atomic < std:: shared_ptr > 인스턴스를 통하지 않는 모든 접근에 대해 데이터 경쟁이 발생합니다 (또는 C++20부터 deprecated된, std::shared_ptr 에 대한 원자적 접근을 위한 독립형 함수 를 통한 접근도 포함).
연관된
use_count
증가는 원자적 연산의 일부로 보장됩니다. 연관된
use_count
감소는 원자적 연산 이후에 순서가 지정되지만, 실패한 CAS에서
expected
를 재정의할 때의
use_count
변경을 제외하고는 원자적 연산의 일부일 필요는 없습니다. 연관된 모든 삭제 및 할당 해제는 원자적 업데이트 단계 이후에 순서가 지정되며 원자적 연산의 일부가 아닙니다.
shared_ptr
의 제어 블록은 스레드 안전함에 유의하십시오: 여러 스레드에서 서로 다른 비원자적
std::shared_ptr
객체들을
operator
=
또는
reset
과 같은 변경 가능한 연산을 사용하여 동시에 접근할 수 있으며, 이러한 인스턴스들이 복사본이더라도 내부적으로 동일한 제어 블록을 공유합니다.
타입 T는 불완전한 타입일 수 있습니다.
멤버 타입
| 멤버 타입 | 정의 |
value_type
|
std:: shared_ptr < T > |
멤버 함수
모든 비전문화 std::atomic 함수들은 이 특수화에 의해 제공되며, 추가적인 멤버 함수는 존재하지 않습니다.
|
constexpr
atomic
(
)
noexcept
=
default
;
|
(1) | |
|
constexpr
atomic
(
std::
nullptr_t
)
noexcept
:
atomic
(
)
{
}
|
(2) | |
|
atomic
(
std::
shared_ptr
<
T
>
desired
)
noexcept
;
|
(3) | |
|
atomic
(
const
atomic
&
)
=
delete
;
|
(4) | |
|
void
operator
=
(
const
atomic
&
)
=
delete
;
|
(1) | |
|
void
operator
=
(
std::
shared_ptr
<
T
>
desired
)
noexcept
;
|
(2) | |
|
void
operator
=
(
std::
nullptr_t
)
noexcept
;
|
(3) | |
|
bool
is_lock_free
(
)
const
noexcept
;
|
||
이 타입의 모든 객체에 대한 원자적 연산이 lock-free인 경우 true 를 반환하고, 그렇지 않은 경우 false 를 반환합니다.
|
void
store
(
std::
shared_ptr
<
T
>
desired,
std:: memory_order order = std:: memory_order_seq_cst ) noexcept ; |
||
* this 의 값을 원자적으로 desired 의 값으로 교체합니다. 이는 내부 std:: shared_ptr < T > 인 p 에 대해 p. swap ( desired ) 를 수행하는 것과 같습니다. 메모리 순서는 order 에 따라 정해집니다. order 가 std::memory_order_consume , std::memory_order_acquire , 또는 std::memory_order_acq_rel 인 경우 동작은 정의되지 않습니다.
|
std::
shared_ptr
<
T
>
load
(
std::
memory_order
order
=
std::
memory_order_seq_cst
)
const
noexcept
;
|
||
기본 shared pointer의 복사본을 원자적으로 반환합니다. 메모리는 order 에 따라 정렬됩니다. order 가 std::memory_order_release 또는 std::memory_order_acq_rel 인 경우 동작은 정의되지 않습니다.
|
std::
shared_ptr
<
T
>
exchange
(
std::
shared_ptr
<
T
>
desired,
std:: memory_order order = std:: memory_order_seq_cst ) noexcept ; |
||
내부의 std:: shared_ptr < T > 을 원자적으로 desired 로 교체하며, 교체 직전의 값을 반환합니다. 이는 내부 p 가 p. swap ( desired ) 를 수행하는 것과 같으며, p 는 내부 std:: shared_ptr < T > 입니다. 메모리 순서는 order 에 따라 정렬됩니다. 이는 원자적 읽기-수정-쓰기 연산입니다.
|
bool
compare_exchange_strong
(
std::
shared_ptr
<
T
>
&
expected,
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_strong
(
std::
shared_ptr
<
T
>
&
expected,
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) | |
use_count
에 대한 이 업데이트는 이 원자적 연산의 일부이지만, 쓰기 자체(및 이후의 할당 해제/소멸)는 반드시 그럴 필요는 없습니다.
fail_order
는
order
와 동일하지만,
std::memory_order_acq_rel
이
std::memory_order_acquire
로 대체되고,
std::memory_order_release
이
std::memory_order_relaxed
로 대체된다.
fail_order
는
order
와 동일하지만,
std::memory_order_acq_rel
이
std::memory_order_acquire
로 대체되고,
std::memory_order_release
이
std::memory_order_relaxed
로 대체된다.
|
void
wait
(
std::
shared_ptr
<
T
>
old,
std:: memory_order order = std:: memory_order_seq_cst ) const noexcept ; |
||
원자적 대기 연산을 수행합니다.
load
(
order
)
을
old
와 비교하여 동등한 경우,
notify_one()
또는
notify_all()
에 의해
*
this
가 통지될 때까지 블록합니다. 이는
load
(
order
)
이 변경될 때까지 반복됩니다. 이 함수는 기본 구현이 허위로 차단을 해제하더라도 값이 변경된 경우에만 반환됨이 보장됩니다.
메모리는 order 에 따라 정렬됩니다. order 가 std::memory_order_release 또는 std::memory_order_acq_rel 인 경우 동작은 정의되지 않습니다.
참고: 두
shared_ptr
이 동일한 포인터를 저장하고 소유권을 공유하거나 둘 다 비어 있는 경우 동등합니다.
|
void
notify_one
(
)
noexcept
;
|
||
원자적 통지 작업을 수행합니다.
*
this
에서 원자적 대기 작업(즉,
wait()
) 중에 차단된 스레드가 있는 경우, 그러한 스레드 중 적어도 하나를 차단 해제합니다; 그렇지 않으면 아무 작업도 수행하지 않습니다.
|
void
notify_all
(
)
noexcept
;
|
||
원자적 통지 작업을 수행합니다.
*
this
에서 원자적 대기 작업(즉,
wait()
) 중에 차단된 모든 스레드의 차단을 해제합니다. 차단된 스레드가 없는 경우 아무 작업도 수행하지 않습니다.
멤버 상수
유일한 표준
std::atomic
멤버 상수
is_always_lock_free
도 이 특수화에 의해 제공됩니다.
|
static
constexpr
bool
is_always_lock_free
=
/*implementation-defined*/
;
|
||
참고 사항
| 기능 테스트 매크로 | 값 | 표준 | 기능 |
|---|---|---|---|
__cpp_lib_atomic_shared_ptr
|
201711L
|
(C++20) |
std::atomic<std::shared_ptr>
|
예제
|
이 섹션은 불완전합니다
이유: 예제 없음 |
결함 보고서
다음의 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.
| DR | 적용 대상 | 게시된 동작 | 수정된 동작 |
|---|---|---|---|
| LWG 3661 | C++20 |
atomic<shared_ptr<T>>
가
nullptr
로부터 상수 초기화 가능하지 않았음
|
상수 초기화 가능하도록 수정됨 |
| LWG 3893 | C++20 |
LWG3661
이
atomic<shared_ptr<T>>
를
nullptr_t
로부터 할당 가능하지 않게 만듦
|
할당 가능성 복원됨 |
참고 항목
|
(C++11)
|
bool, 정수형,
부동소수점,
(since C++20)
및 포인터 타입에 대한 atomic 클래스 템플릿 및 특수화
(클래스 템플릿) |