Maison  >  Article  >  développement back-end  >  Un singleton sans verrouillage avec des opérations atomiques est-il une meilleure approche en C 11 que l'utilisation de mutex ?

Un singleton sans verrouillage avec des opérations atomiques est-il une meilleure approche en C 11 que l'utilisation de mutex ?

Susan Sarandon
Susan Sarandonoriginal
2024-10-31 21:21:02430parcourir

Is a Lock-Free Singleton with Atomic Operations a Better Approach in C  11 Than Using Mutexes?

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!

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