>백엔드 개발 >C++ >공유 객체를 수정할 때 std::shared_ptr은 스레드로부터 안전합니까?

공유 객체를 수정할 때 std::shared_ptr은 스레드로부터 안전합니까?

Patricia Arquette
Patricia Arquette원래의
2024-11-09 22:55:02285검색

Is std::shared_ptr Thread-Safe When Modifying Shared Objects?

std::shared_ptr 스레드 안전성 이해

문서에서는 제어 블록의 스레드 안전성을 언급합니다. 객체의 공유 소유권을 관리합니다. 여러 스레드는 충돌 없이 기본 리소스의 소유권을 공유하므로 서로 다른 shared_ptr 개체에 동시에 액세스할 수 있습니다. 그러나 이것이 공유 객체 자체 수정의 안전성을 보장하지는 않습니다.

Shared_ptr 및 객체 수정

코드 예제에서 스레드 1은 전역 객체의 개인 복사본을 생성합니다. shared_ptr을 사용하는 반면 스레드 2는 전역 자체를 수정합니다. 다음은 동작에 대한 설명입니다.

  • 스레드 1의 프라이빗은 처음에 전역의 원래 값으로 설정됩니다.
  • 스레드 2가 글로벌을 수정하는 경우 프라이빗 포인트로서 프라이빗의 포인터에 영향을 주지 않습니다.
  • 그러나 private은 결국 소멸되어 다음에 의해 수정된 제어 블록의 참조 카운트가 감소합니다. 스레드 2.
  • private은 유효한 shared_ptr로 유지되지만 수명은 수정된 전역과 무관합니다.

스레드 안전 고려 사항

여러 스레드가 공유하는 객체를 안전하게 수정하려면 std::mutex와 같은 동기화 메커니즘을 사용해야 합니다. 다음 예에서는 뮤텍스를 사용한 스레드로부터 안전한 구성 업데이트를 보여줍니다.

// Shared pointer to the configuration object
std::shared_ptr<Configuration> global_config = make_shared<Configuration>();

// Mutex to protect the configuration object
std::mutex config_mutex;

void thread_fcn() {
    // Lock the mutex before accessing the configuration
    std::lock_guard<std::mutex> lock(config_mutex);

    // Update the configuration from global_config
    // ...

    // Unlock the mutex after finishing the update
}

global_config를 수정하기 전에 뮤텍스를 획득하면 다른 스레드의 간섭을 방지할 수 있습니다. 이렇게 하면 구성이 항상 일관되고 스레드로부터 안전한 방식으로 업데이트됩니다.

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

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