Maison >développement back-end >C++ >Quelle sécurité des threads `std::shared_ptr` fournit-il réellement ?

Quelle sécurité des threads `std::shared_ptr` fournit-il réellement ?

DDD
DDDoriginal
2024-11-14 17:24:02272parcourir

How Much Thread-Safety Does `std::shared_ptr` Actually Provide?

Dans quelle mesure std::shared_ptr garantit-il la sécurité des threads ?

Comprendre la sécurité des threads de std::shared_ptr est crucial pour les opérations simultanées programmation. Voici un examen détaillé de vos questions :

1. La norme garantit que le comptage de références est géré de manière thread-safe et qu'il est indépendant de la plate-forme, n'est-ce pas ?

Oui, c'est correct. Le nombre de références est géré de manière atomique, garantissant un fonctionnement thread-safe quelle que soit la plate-forme sous-jacente.

2. Problème similaire : la norme garantit qu'un seul thread (contenant la dernière référence) appellera delete sur l'objet partagé, n'est-ce pas ?

Oui, c'est également vrai. La norme garantit que lorsque la dernière référence à un objet partagé est publiée, un seul thread appellera le destructeur, garantissant ainsi la destruction de l'objet sans conditions de concurrence.

3. Shared_ptr ne garantit aucune sécurité des threads pour l'objet qui y est stocké ?

Correct. std::shared_ptr fournit la sécurité des threads pour la gestion des pointeurs et du nombre de références, mais il ne garantit pas la sécurité des threads de l'objet sous-jacent lui-même. La sécurité des threads de l'objet dépend de son implémentation.

Exemple :

Considérez le pseudo-code suivant :

// 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));

Contrairement à votre hypothèse, après avoir appelé reset() dans le thread IV, d pointera vers le A(10) nouvellement créé, tandis que a, b et c continueront à pointer vers le A(1) d'origine. Ce comportement est illustré dans le code suivant :

#include <memory>
#include <iostream>

struct A {
  int a;
  A(int a) : a(a) {}
};

int main() {
  shared_ptr<A> a(new A(1));
  shared_ptr<A> b(a), c(a), d(a);

  cout << "a: " << a->a << "\tb: " << b->a
     << "\tc: " << c->a << "\td: " << d->a << endl;

  d.reset(new A(10));

  cout << "a: " << a->a << "\tb: " << b->a
     << "\tc: " << c->a << "\td: " << d->a << endl;

  return 0;
}

Sortie :

a: 1    b: 1    c: 1    d: 1
a: 1    b: 1    c: 1    d: 10

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn