Maison > développement back-end > C++ > 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
Libérer: 2024-10-31 21:21:02
original
489 Les gens l'ont consulté

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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal