weak_ptr_atomic2

weak_ptr_atomic2 (std::atomicstd::weak_ptr)

<memory> 헤더에 정의되어 있어요. std::weak_ptr<T>에 대한 std::atomic의 부분 템플릿 특수화예요. weak_ptr 객체를 원자적으로 조작할 수 있게 해줘요. T는 불완전 타입일 수 있어요. C++20부터 도입됐어요.

출처: cppreference

본문

template< class T >
struct std::atomic<std::weak_ptr<T>>;

(C++20부터)

std::weak_ptr<T>에 대한 std::atomic의 부분 특수화는 사용자가 weak_ptr 객체를 원자적으로 조작할 수 있게 해줘요. T는 불완전 타입일 수 있어요.

여러 실행 스레드가 동기화 없이 같은 std::weak_ptr 객체에 접근하고 그 중 하나라도 비-const 멤버 함수를 사용하면, 모든 접근이 std::atomic<std::weak_ptr> 인스턴스를 통해(또는 C++20부터 deprecated된 독립 함수들로) 수행되지 않는 한 데이터 경쟁이 발생해요.

연관된 use_count 증가는 원자 연산의 일부로 보장돼요. 연관된 use_count 감소는 원자 연산 뒤에 순서가 정해지지만 그 일부는 아니에요.

shared_ptr의 제어 블록은 스레드 안전하므로, 서로 다른 비-원자 weak_ptr·shared_ptr 객체는 내부적으로 같은 제어 블록을 공유하고 있어도 가변 연산을 여러 스레드가 동시에 수행해도 안전해요.

중첩 타입

  • value_type: std::weak_ptr<T>

멤버 함수

이 특수화는 특수화되지 않은 std::atomic 함수(load, store, exchange, compare_exchange_weak/strong, wait, notify_one, notify_all, is_lock_free 등)를 모두 제공해요.

weak_ptr는 비소유 참조이므로, 다중 스레드에서 공유 shared_ptr의 수명을 추적하거나 감시할 때 std::atomic<std::weak_ptr<T>>를 사용해요.

std::atomic<std::weak_ptr<Widget>> g_widget;
auto w = g_widget.load();
if (auto sp = w.lock()) { /* sp 사용 */ }

더 알아보기 (Learn more)

cppreference