"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > O std::shared_ptr é verdadeiramente seguro para threads e quanto às modificações simultâneas no objeto apontado?

O std::shared_ptr é verdadeiramente seguro para threads e quanto às modificações simultâneas no objeto apontado?

Publicado em 2025-01-07
Navegar:239

Is std::shared_ptr truly thread-safe, and what about concurrent modifications to the pointed object?

Thread Safety de std::shared_ptr

A declaração que você citou do MSDN sobre a segurança de thread de std::shared_ptr pode ser mal interpretada. Isso implica que, embora vários threads possam ler e gravar simultaneamente objetos shared_ptr distintos, isso não garante a segurança da modificação do próprio objeto shared_ptr.

TL;DR:

A segurança do thread de std::shared_ptr refere-se apenas ao gerenciamento de vários ponteiros apontando para o mesmo objeto subjacente. Ele não se estende ao conteúdo do objeto compartilhado ou gravações simultâneas na instância shared_ptr.

Breakdown:

Um shared_ptr consiste internamente em dois componentes:

  • Control Block: Gerencia a contagem de referências do shared_ptr e garante a destruição adequada do objeto apontado. Este componente é thread-safe.
  • Objeto apontado: a estrutura de dados real ou o objeto que está sendo compartilhado. A segurança do thread deste objeto depende de sua implementação.

Exemplo:

Em seu snippet de código, global é um ponteiro compartilhado para um objeto de configuração. O thread 1 copia global em seu próprio ponteiro compartilhado, privado. Se o Thread 2 modificasse posteriormente o global, o private ainda apontaria para o objeto de configuração original, pois o bloco de controle não foi modificado. No entanto, se o Thread 2 atribuir um novo objeto de configuração ao global, o private permanecerá apontando para o objeto original.

Thread Safety de objetos apontados:

A capacidade de segurança modificar o objeto apontado por meio de vários threads depende da implementação do objeto. No caso da sua classe de configuração, se ela permitir gravações simultâneas sem sincronização, como adicionar ou remover configurações, o código não será thread-safe.

Solução:

Para garantir a segurança do thread para modificações de objetos, use mecanismos de sincronização como std::mutex para proteger o acesso ao objeto shared_ptr ou ao próprio objeto compartilhado.

Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3