Singleton de Meyers : évaluation et amélioration de la sécurité des threads
L'implémentation par Meyers du modèle Singleton utilise une initialisation paresseuse, mais sa sécurité des threads reste une préoccupation. Cet article explore les subtilités de la sécurité des threads dans le code donné :
static Singleton& instance() { static Singleton s; return s; }
En C 11 et au-delà
En C 11, l'initialisation paresseuse des objets globaux est thread safe en vertu de la garantie du standard : une initialisation simultanée entraînera une attente jusqu'à son achèvement. GCC et Visual Studio prennent en charge cette fonctionnalité.
Par conséquent, dans un environnement C 11 ou version ultérieure, l'implémentation Singleton de Meyers est thread-safe.
En C 03 et versions antérieures
En C 03 et versions antérieures, le code fourni n'est pas thread-safe. Comme décrit par Meyers dans son article, les modèles de verrouillage revérifiés peuvent être sensibles à des conditions de concurrence critique sur certaines architectures. Pour assurer la sécurité des threads dans ce contexte, un verrouillage complet autour de la méthode d'instanciation est recommandé.
Code pour C 03 Thread Safety
Voici une modification du code pour Sécurité des threads C 03 :
static Singleton*& instance() { static Singleton* s = nullptr; static std::mutex s_mutex; std::lock_guard<std::mutex> guard(s_mutex); if (!s) s = new Singleton; return s; }
Cette implémentation utilise un mutex pour synchroniser l'accès lors de l'initialisation, garantissant ainsi la sécurité des threads.
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!