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 >
bool atomic_is_lock_free ( const std:: shared_ptr < T > * p ) ;
(1) (C++11부터)
(C++20에서 사용 중단됨)
(C++26에서 제거됨)
template < class T >
std:: shared_ptr < T > atomic_load ( const std:: shared_ptr < T > * p ) ;
(2) (C++11부터)
(C++20에서 사용 중단됨)
(C++26에서 제거됨)
template < class T >

std:: shared_ptr < T > atomic_load_explicit

( const std:: shared_ptr < T > * p, std:: memory_order mo ) ;
(3) (C++11부터)
(C++20에서 사용 중단됨)
(C++26에서 제거됨)
template < class T >
void atomic_store ( std:: shared_ptr < T > * p, std:: shared_ptr < T > r ) ;
(4) (C++11부터)
(C++20에서 사용 중단됨)
(C++26에서 제거됨)
template < class T >

void atomic_store_explicit
( std:: shared_ptr < T > * p, std:: shared_ptr < T > r,

std:: memory_order mo ) ;
(5) (C++11 이후)
(C++20에서 사용 중단)
(C++26에서 제거됨)
template < class T >

std:: shared_ptr < T > atomic_exchange

( std:: shared_ptr < T > * p, std:: shared_ptr < T > r ) ;
(6) (C++11부터)
(C++20에서 사용 중단됨)
(C++26에서 제거됨)
template < class T >

std:: shared_ptr < T > atomic_exchange_explicit
( std:: shared_ptr < T > * p, std:: shared_ptr < T > r,

std:: memory_order mo ) ;
(7) (C++11 이후)
(C++20에서 사용 중단됨)
(C++26에서 제거됨)
template < class T >

bool atomic_compare_exchange_weak
( std:: shared_ptr < T > * p, std:: shared_ptr < T > * expected,

std:: shared_ptr < T > desired ) ;
(8) (C++11부터)
(C++20에서 사용 중단됨)
(C++26에서 제거됨)
template < class T >

bool atomic_compare_exchange_strong
( std:: shared_ptr < T > * p, std:: shared_ptr < T > * expected,

std:: shared_ptr < T > desired ) ;
(9) (C++11부터)
(C++20에서 사용 중단됨)
(C++26에서 제거됨)
template < class T >

bool atomic_compare_exchange_strong_explicit
( std:: shared_ptr < T > * p, std:: shared_ptr < T > * expected,
std:: shared_ptr < T > desired,

std:: memory_order success, std:: memory_order failure ) ;
(10) (C++11부터)
(C++20에서 사용 중단됨)
(C++26에서 제거됨)
template < class T >

bool atomic_compare_exchange_weak_explicit
( std:: shared_ptr < T > * p, std:: shared_ptr < T > * expected,
std:: shared_ptr < T > desired,

std:: memory_order success, std:: memory_order failure ) ;
(11) (C++11부터)
(C++20에서 사용 중단됨)
(C++26에서 제거됨)

다중 실행 스레드가 동기화 없이 동일한 std::shared_ptr 객체에 접근하고, 이들 접근 중 하나라도 shared_ptr 의 비-const 멤버 함수를 사용하는 경우, 모든 해당 접근이 해당 원자적 접근 함수들의 오버로드( std::atomic_load , std::atomic_store 등)를 통해 수행되지 않으면 데이터 경쟁이 발생합니다.

shared_ptr 의 제어 블록은 스레드 안전함에 유의하십시오: 서로 다른 std::shared_ptr 객체들은 operator = 또는 reset 과 같은 가변 연산을 사용하여 여러 스레드에서 동시에 접근될 수 있으며, 이러한 인스턴스들이 사본이더라도 내부적으로 동일한 제어 블록을 공유합니다.

1) p 가 가리키는 공유 포인터에 대한 원자적 접근이 잠금 없는 방식인지 여부를 결정합니다.
2) 다음에 해당함 atomic_load_explicit ( p, std:: memory_order_seq_cst ) .
3) p 가 가리키는 shared pointer를 반환합니다.
비특수화된 std::atomic_load_explicit 와 마찬가지로, mo std:: memory_order_release 또는 std:: memory_order_acq_rel 인 경우 동작은 정의되지 않습니다.
4) 다음에 해당함 atomic_store_explicit ( p, r, std:: memory_order_seq_cst ) .
5) 공유 포인터 r 을 원자적으로 p 가 가리키는 공유 포인터에 저장합니다, as if p - > swap ( r ) 를 사용하는 것처럼.
비특수화된 std::atomic_store_explicit 과 마찬가지로, mo std:: memory_order_acquire 또는 std:: memory_order_acq_rel 인 경우 동작은 정의되지 않습니다.
6) 다음에 해당함: atomic_exchange_explicit ( p, r, std:: memory_order_seq_cst ) .
7) 공유 포인터 r 을 가리키는 공유 포인터 p 에 저장하고 원자적으로 p 가 이전에 가리키던 값을 반환합니다. as if 규칙에 따라 p - > swap ( r ) 를 수행한 후 스왑된 r 의 복사본을 반환합니다.
8) 다음과 동등함
atomic_compare_exchange_weak_explicit
( p, expected, desired, std:: memory_order_seq_cst ,
std:: memory_order_seq_cst )
.
9) 다음과 동일함
atomic_compare_exchange_strong_explicit
( p, expected, desired, std:: memory_order_seq_cst ,
std:: memory_order_seq_cst )
.
10,11) p expected 가 가리키는 shared pointer를 비교합니다.
  • 두 포인터가 동등한 경우(동일한 포인터 값을 저장하고, 동일한 객체에 대한 소유권을 공유하거나 둘 다 비어 있는 경우), success 에 지정된 메모리 순서 제약 조건을 사용하여 * p desired 를 할당하고 true 를 반환합니다.
  • 두 포인터가 동등하지 않은 경우, failure 에 지정된 메모리 순서 제약 조건을 사용하여 * expected * p 를 할당하고 false 를 반환합니다.
atomic_compare_exchange_weak_explicit 는 가끔 실패할 수 있습니다.
만약 expected 가 널 포인터이거나, failure std:: memory_order_release 또는 std:: memory_order_acq_rel 인 경우, 동작은 정의되지 않습니다.

만약 p 가 널 포인터인 경우, 이 함수들의 동작은 모두 정의되지 않습니다.

목차

매개변수

p, expected - std::shared_ptr 에 대한 포인터
r, desired - std::shared_ptr
mo, success, failure - std::memory_order 타입의 메모리 순서 선택자

예외

이 함수들은 예외를 발생시키지 않습니다.

반환값

1) true 원자적 접근이 락-프리 명령어를 사용하여 구현된 경우.
2,3) 가리키는 공유 포인터의 복사본입니다.
4,5) (없음)
6,7) 이전에 가리키던 공유 포인터의 복사본.
8-11) true 공유 포인터가 동등하고 교환이 수행된 경우, false 그렇지 않은 경우.

참고 사항

이러한 함수들은 일반적으로 뮤텍스를 사용하여 구현되며, 포인터 값을 키로 사용하는 전역 해시 테이블에 저장됩니다.

Concurrency TS 는 이러한 함수들의 사용을 대체하기 위해 원자적 스마트 포인터 클래스 atomic_shared_ptr atomic_weak_ptr 를 제공합니다.

이 함수들은 다음 템플릿 특수화를 선호하여 사용 중단되었습니다: std::atomic template: std:: atomic < std:: shared_ptr > std:: atomic < std:: weak_ptr > .

(C++20부터)
(C++26까지)

이 함수들은 다음 템플릿 특수화를 선호하여 제거되었습니다: std::atomic template: std:: atomic < std:: shared_ptr > std:: atomic < std:: weak_ptr > .

(C++26부터)

예제

결함 보고서

다음의 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.

DR 적용 대상 게시된 동작 올바른 동작
LWG 2172 C++11 expected 가 널 포인터일 수 있었음 이 경우 동작은 정의되지 않음
LWG 2980 C++11 shared_ptr 들은 동등하지 않았음 동일한 포인터 값을 저장할 경우 동등함

참고 항목

원자적 타입의 연산이 잠금 없는 방식인지 확인합니다
(함수 템플릿)
원자적 객체의 값을 비원자적 인수로 원자적으로 대체합니다
(함수 템플릿)
원자적 객체에 저장된 값을 원자적으로 획득합니다
(함수 템플릿)
원자적 객체의 값을 비원자적 인수로 원자적으로 대체하고 원자적 객체의 이전 값을 반환합니다
(함수 템플릿)
원자적 객체의 값을 비원자적 인수와 원자적으로 비교하고, 같으면 원자적 교환을 수행하고 다르면 원자적 로드를 수행합니다
(함수 템플릿)