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

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

Patricia Arquette
Patricia Arquette원래의
2024-11-15 13:03:02254검색

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

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

원래 질문:

  1. 참조 std::shared_ptr의 계산은 스레드로부터 안전하고 플랫폼 독립적임을 보장합니다.
  2. 마지막 참조를 보유한 스레드만이 공유 객체에 대해 delete를 호출합니다.
  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, c는 계속해서 원래 A(1)를 가리킵니다.

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

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

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.