Maison  >  Article  >  développement back-end  >  Comment implémenter un singleton sans verrouillage en C 11 sans mutex ?

Comment implémenter un singleton sans verrouillage en C 11 sans mutex ?

Patricia Arquette
Patricia Arquetteoriginal
2024-10-29 12:12:29376parcourir

How to Implement a Lock-Free Singleton in C  11 Without Mutexes?

Implémentation de Singleton multithread-safe en C 11 sans mutex

En C 11, le multithreading introduit de nouvelles préoccupations pour l'implémentation de classes singleton. Bien que l'utilisation de mutex puisse garantir la sécurité des threads, elle peut affecter les performances. Cet article explore une approche alternative pour créer un singleton sans verrouillage sans recourir aux mutex.

Énoncé du problème :

Comment pouvons-nous implémenter un singleton initialisé paresseux en C 11 sans utiliser de mutex pour des raisons de performances ?

Solution proposée :

atomic_compare_exchange_strong :

Pour obtenir une initialisation sans verrouillage, nous peut exploiter la fonction std::atomic_compare_exchange_strong. Cette opération atomique compare la valeur attendue d'une variable std::atomic (flag) avec sa valeur souhaitée (desr) et, si elles correspondent, met à jour la variable en desr.

Processus d'initialisation :

Dans la fonction d'initialisation, nous effectuons les étapes suivantes :

  1. Définissez l'indicateur sur 1 pour indiquer que l'initialisation est en cours.
  2. Utilisez atomic_compare_exchange_strong pour vérifier si flag est 1. Si c'est le cas, nous procédons à l'initialisation.
  3. Si le CAS réussit, le flag est défini sur 2 pour indiquer une initialisation réussie.
  4. Si le CAS échoue, un autre thread a déjà été initialisé le singleton.

Thread Safety :

L'exécution simultanée des threads est gérée par les mesures suivantes :

  • If flag est déjà 2, l'initialisation a déjà été terminée.
  • Si l'indicateur est 0, nous essayons de l'initialiser en utilisant atomic_compare_exchange_strong.
  • Si l'indicateur est 1, un autre thread est en cours d'initialisation, donc le courant le fil attend.

Exemple de mise en œuvre :

<code class="cpp">class Singleton
{
public:
    static Singleton& get()
    {
        static Singleton instance;
        return instance;
    }

    static bool initialize(const string& name);
};</code>

Conclusion :

En exploitant la fonction atomic_compare_exchange_strong, nous pouvons implémenter un singleton multithread-safe en C 11 sans compter sur les mutex. Cette approche garantit qu'un seul thread réussira à initialiser le singleton à un moment donné.

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