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 사용 */ }