Namespaces
Variants

std:: atomic <std::shared_ptr>

From cppreference.net
Memory management library
( exposition only* )
Allocators
Uninitialized memory algorithms
Constrained uninitialized memory algorithms
Memory resources
Uninitialized storage (until C++20)
( until C++20* )
( until C++20* )
( until C++20* )

Garbage collector support (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
헤더에 정의됨 <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 함수들은 이 특수화에 의해 제공되며, 추가적인 멤버 함수는 존재하지 않습니다.

atomic<shared_ptr<T>>:: 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)
1,2) 기본 shared_ptr < T > 을 null 값으로 초기화합니다.
3) 기본 shared_ptr < T > desired 의 복사본으로 초기화합니다. 다른 std::atomic 타입과 마찬가지로, 초기화는 원자적 연산이 아닙니다.
4) 원자적 타입은 복사/이동 생성이 불가능합니다.

atomic<shared_ptr<T>>:: operator=

void operator = ( const atomic & ) = delete ;
(1)
void operator = ( std:: shared_ptr < T > desired ) noexcept ;
(2)
void operator = ( std:: nullptr_t ) noexcept ;
(3)
1) 원자적 타입은 복사/이동 할당이 불가능합니다.
2) 값 할당, store ( desired ) 과 동일합니다.
3) 원자적 공유 포인터를 널 포인터 값으로 재설정합니다. store ( nullptr ) ; 과 동일합니다.

atomic<shared_ptr<T>>:: is_lock_free

bool is_lock_free ( ) const noexcept ;

이 타입의 모든 객체에 대한 원자적 연산이 lock-free인 경우 true 를 반환하고, 그렇지 않은 경우 false 를 반환합니다.

atomic<shared_ptr<T>>:: store

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 인 경우 동작은 정의되지 않습니다.

atomic<shared_ptr<T>>:: load

기본 shared pointer의 복사본을 원자적으로 반환합니다. 메모리는 order 에 따라 정렬됩니다. order std::memory_order_release 또는 std::memory_order_acq_rel 인 경우 동작은 정의되지 않습니다.

atomic<shared_ptr<T>>:: operator std::shared_ptr<T>

operator std:: shared_ptr < T > ( ) const noexcept ;

return load ( ) ; 와 동등합니다.

atomic<shared_ptr<T>>:: exchange

내부의 std:: shared_ptr < T > 을 원자적으로 desired 로 교체하며, 교체 직전의 값을 반환합니다. 이는 내부 p p. swap ( desired ) 를 수행하는 것과 같으며, p 는 내부 std:: shared_ptr < T > 입니다. 메모리 순서는 order 에 따라 정렬됩니다. 이는 원자적 읽기-수정-쓰기 연산입니다.

atomic<shared_ptr<T>>:: compare_exchange_weak, compare_exchange_strong

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)
1) 기본 std:: shared_ptr < T > expected 와 동일한 T * 를 저장하고 소유권을 공유하거나, 기본과 expected 가 모두 비어 있는 경우, desired 를 기본 std:: shared_ptr < T > 에 할당하고, true 를 반환하며, success 에 따라 메모리를 정렬합니다. 그렇지 않으면 기본 std:: shared_ptr < T > 에서 expected 로 할당하고, false 를 반환하며, failure 에 따라 메모리를 정렬합니다. failure std::memory_order_release 또는 std::memory_order_acq_rel 인 경우 동작은 정의되지 않습니다. 성공 시 이 연산은 * this 에 대한 원자적 읽기-수정-쓰기 연산이며, expected 는 원자적 업데이트 이후 접근되지 않습니다. 실패 시 이 연산은 * this 에 대한 원자적 로드 연산이며, expected 는 원자 객체에서 읽은 기존 값으로 업데이트됩니다. expected use_count 에 대한 이 업데이트는 이 원자적 연산의 일부이지만, 쓰기 자체(및 이후의 할당 해제/소멸)는 반드시 그럴 필요는 없습니다.
2) (1) 과 동일하지만, 가끔 잘못된 실패를 보일 수도 있습니다.
3) 다음에 해당함: return compare_exchange_strong ( expected, desired, order, fail_order ) ; , 여기서 fail_order order 와 동일하지만, std::memory_order_acq_rel std::memory_order_acquire 로 대체되고, std::memory_order_release std::memory_order_relaxed 로 대체된다.
4) 다음에 해당함: return compare_exchange_weak ( expected, desired, order, fail_order ) ; , 여기서 fail_order order 와 동일하지만, std::memory_order_acq_rel std::memory_order_acquire 로 대체되고, std::memory_order_release std::memory_order_relaxed 로 대체된다.

atomic<shared_ptr<T>>:: wait

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 이 동일한 포인터를 저장하고 소유권을 공유하거나 둘 다 비어 있는 경우 동등합니다.

atomic<shared_ptr<T>>:: notify_one

void notify_one ( ) noexcept ;

원자적 통지 작업을 수행합니다.

* this 에서 원자적 대기 작업(즉, wait() ) 중에 차단된 스레드가 있는 경우, 그러한 스레드 중 적어도 하나를 차단 해제합니다; 그렇지 않으면 아무 작업도 수행하지 않습니다.

atomic<shared_ptr<T>>:: notify_all

void notify_all ( ) noexcept ;

원자적 통지 작업을 수행합니다.

* this 에서 원자적 대기 작업(즉, wait() ) 중에 차단된 모든 스레드의 차단을 해제합니다. 차단된 스레드가 없는 경우 아무 작업도 수행하지 않습니다.

멤버 상수

유일한 표준 std::atomic 멤버 상수 is_always_lock_free 도 이 특수화에 의해 제공됩니다.

atomic<shared_ptr<T>>:: 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 클래스 템플릿 및 특수화
(클래스 템플릿)