> 백엔드 개발 > C++ > std::shared_ptr이 관리하는 객체에 대해 스레드로부터 안전합니까?

std::shared_ptr이 관리하는 객체에 대해 스레드로부터 안전합니까?

Patricia Arquette
풀어 주다: 2024-11-15 13:03:02
원래의
334명이 탐색했습니다.

Is std::shared_ptr thread-safe for the object it manages?

std::shared_ptr은 어느 정도 스레드 안전성을 보장합니까?

원래 질문:

  1. 참조 std::shared_ptr에서의 계산은 스레드로부터 안전함을 보장하며 플랫폼 독립적입니다.
  2. 마지막 참조를 보유한 스레드만 공유 객체에 대해 삭제를 호출합니다.
  3. std::shared_ptr은 저장하는 객체에 대해 스레드 안전성을 제공하지 않습니다.

답변:

예, 처음 두 질문입니다. 정확합니다. std::shared_ptr의 참조 계산 및 소멸자 호출은 스레드로부터 안전합니다.

세 번째 질문도 맞습니다. std::shared_ptr은 그 안에 저장된 객체에 대한 스레드 안전성을 보장하지 않습니다. 객체 자체는 스레드로부터 안전하지 않을 수 있으므로 적절한 동기화 없이 여러 스레드에서 객체에 액세스하면 정의되지 않은 동작이 발생할 수 있습니다.

예:

다음을 고려하세요. 조각 의사 코드:

// Thread I
shared_ptr<A> a (new A (1));

// Thread II
shared_ptr<A> b (a);

// Thread III
shared_ptr<A> c (a);

// Thread IV
shared_ptr<A> d (a);

d.reset (new A (10));
로그인 후 복사
  • 질문: 스레드 IV에서 재설정()을 호출하면 스레드 I에서 생성된 A의 이전 인스턴스가 삭제되고 새 인스턴스로 교체됩니까?
  • 정답: 아니요, d만이 새로운 A(10)를 가리키고, a, b, and c는 계속해서 원본 A(1)을 가리킵니다.

이는 Reset()이 동일한 객체에 대한 다른 스레드의 참조에 영향을 주지 않기 때문입니다. d는 새 인스턴스를 가리키는 유일한 공유 포인터이고, 다른 참조(a, b, c)는 원래 인스턴스를 계속 가리킵니다.

위 내용은 std::shared_ptr이 관리하는 객체에 대해 스레드로부터 안전합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿