재검토된 공유 포인터 및 스레드 안전성
std::shared_ptr의 스레드 안전성은 C 프로그래머들 사이에서 많은 논의의 주제였습니다. 그 진정한 성격을 명확히 하기 위해 더 세밀한 세부 사항을 조사해 보겠습니다.
주의: MS의 의미
귀하가 언급한 MSDN의 설명은 오해의 소지가 있을 수 있습니다. 예, 여러 스레드는 문제 없이 서로 다른 shared_ptr 개체를 읽고 쓸 수 있습니다. 그러나 이는 공유되는 개체의 참조 횟수를 관리하는 제어 블록에만 적용됩니다. 공유 객체의 내용을 수정하는 것이 안전하다는 의미는 아닙니다
제어 블록의 권한
제어 블록 자체는 스레드로부터 안전한 참조 카운팅은 실제로 스레드로부터 안전합니다. 이를 통해 데이터 손상에 대한 걱정 없이 shared_ptr 인스턴스를 동시에 생성하고 삭제할 수 있습니다. 그러나 그들이 가리키는 개체는 다른 이야기입니다.
공유 개체 액세스: 주의해서 진행하세요
제공한 예에서:
shared_ptr<myClass> global = make_shared<myClass>();
이는 스레드로부터 안전한 참조 카운팅 관리에 완벽합니다. 그러나 다음 줄은
shared_ptr<myClass> private = global; global = make_shared<myClass>();
여러 스레드가 이러한 shared_ptr 인스턴스에 동시에 액세스하는 경우 위험합니다. 전역을 수정하면 잠재적으로 비공개가 불안정해질 수 있습니다. 참조하는 값이 유효하지 않거나 손상될 수 있습니다.
동기화의 필요성
shared_ptr이 가리키는 실제 개체에 대한 스레드로부터 안전한 액세스를 보장하려면 다음이 필요합니다. 별도의 동기화 메커니즘. 일반적인 접근 방식은 뮤텍스나 잠금을 사용하여 공유 객체를 수정하는 모든 작업을 보호하는 것입니다. 이렇게 하면 한 번에 하나의 스레드만 수정할 수 있어 데이터 손상을 방지할 수 있습니다.
결론
std::shared_ptr은 주로 여러 항목 간의 참조 계산을 조정하는 데 사용된다는 점을 기억하세요. 사본. 마법처럼 기본 개체를 스레드로부터 안전하게 만들지는 않습니다. 따라서 공유 객체에 액세스하고 수정할 때 잠재적인 문제를 방지하려면 항상 적절한 스레드 동기화 기술을 사용하십시오.
위 내용은 std::shared_ptr은 객체 액세스에 있어 스레드로부터 안전한가요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!