Implémentation de Singleton multithread en C 11
Avec l'avènement des capacités multithread de C 11, l'approche traditionnelle consistant à utiliser des mutex pour l'implémentation de singleton peut ne plus n'est plus nécessaire pour des raisons de performances.
Singleton sans verrouillage avec opérations atomiques
Une méthode pour créer un singleton sans mutex consiste à utiliser des opérations atomiques. À l'aide des variables atomiques bool et de la fonction std::atomic_compare_exchange_strong(), vous pouvez implémenter la solution suivante :
<code class="cpp">public class Singleton { private static atomic<int> flag = 0; private static string name; public static bool initialized() { return (flag == 2); } public static bool initialize(string name_) { if (flag == 2) { return false; // Already initialized } int exp = 0, desr = 1; bool willInitialize = std::atomic_compare_exchange_strong(&flag, &exp, desr); if (!willInitialize) { return false; // Another thread CASed before us } initialize_impl(name_); assert(flag == 1); flag = 2; return true; } private static void initialize_impl(string name) { name = name; } }</code>
C 11 Thread-Safe Initialization
C 11 introduit l'initialisation statique thread-safe, supprimant le besoin de verrouillage manuel. Exécution simultanée en attente d'initialisation des variables locales statiques, permettant l'implémentation simplifiée suivante :
<code class="cpp">static Singleton& get() { static Singleton instance; return instance; }</code>
Alternatives à Singleton
Il est important de noter que même si ces solutions fournir des implémentations singleton multithread sécurisées, le modèle Singleton lui-même n'est pas toujours le meilleur choix de conception. Envisagez des alternatives telles que le passage d'objets comme arguments de fonction, l'utilisation de l'injection de dépendances ou l'utilisation du modèle d'état.
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!