Question

Objets et variables créées dans une fonction membre statique ne sont pas considérés comme « local » comme ils le feraient dans une fonction membre, de sorte qu'ils peuvent désormais être partagées entre plusieurs threads droit?

Alors que si vous avez une fonction membre qui crée un objet, ce serait local au fil et il est donc non partagée.

Ai-je raison en disant cela?

Était-ce utile?

La solution

Non, vous n'êtes pas correct.

Les objets créés dans une fonction statique ne sont pas partagée, ce qui est également le cas pour toutes les fonctions normales.

Les objets peuvent être partagés mais si elles sont déclarées elles-mêmes statique, et il ne dépend pas si la fonction est statique ou non.

void myFunc()
{
    static MyObject o;
    o.CallMethod(); // here o is shared by all threads calling myFunc
}

Quand un objet est déclarée statique, il est comme si l'objet était une variable globale, mais seulement visible dans le cadre de la fonction qu'elle est déclarée dans.

Autres conseils

Considérez cette classe

class CData
{
public:
    static void func()
    {
        int a;
        static int b;
    }

    int c;
    static int d;
};

int main()
{
    CData::func();
}

variables a est locale à chaque appel de func(). Si deux threads appellent func() en même temps, ils obtiennent différentes versions de a.

b est locale statique. La valeur persiste entre les différents appels de func(). Si deux threads appellent func() en même temps, ils accèdent à la même version de b donc ils pourraient avoir besoin de faire la synchronisation.

c est une variable d'instance; il est attaché à une instanciation particulière de CData. func() c ne peut pas accéder, sauf un truc que je vais vous montrer ci-dessous.

d est une variable statique. Il y a une instance de d partagée entre toutes les utilisations de la classe CData si la synchronisation peut être nécessaire. Il peut être utilisé facilement à partir de la func() fonction statique.

Le tour utilisé pour les données d'instance d'accès à partir d'une fonction statique consiste à faire passer un objet valide dans la fonction.

par exemple.

class CData
{
public:
    static void func(CData *p)
    {
        int a;
        static int b;

        b = p->c;
    }

    int c;
    static int d;
};

int main()
{
    CData data;
    CData::func(&data);
}

L'espoir qui aide.

Non, vous n'êtes pas correct. Et oui, C ++ fait très bien l'utilisation excessive du mot « statique ».

Une variable de membre de classe statique est bien sûr une approche globale de la classe agit comme un champ d'espace de noms et avec quelques différences de privilèges d'accès si elle est privée ou protégée (accessible uniquement par la classe).

Cependant, une fonction membre de classe statique est comme un régulier sans fonction (non membre de la classe) et a ses propres variables locales chaque fois qu'il est appelé.

La seule vraie différence entre une fonction de membre de classe statique et sans fonction régulière, en dehors de sa convention de nommage, est qu'il a accès aux membres privés d'une classe (et a besoin d'une « instance » externe d'un).

En outre, une fonction de membre de classe statique peut être appelé à partir d'un modèle avec un paramètre de modèle variable invoquant ce qui est communément appelé « polymorphisme compilation » et est couramment utilisé dans les méta-programmation.

Une statique variable « locale » dans une fonction est une instance unique, d'autre part, est un peu comme une approche globale et est sensible aux threads contention des questions comme deux threads appelant l'accès aux fonctions de la même instance.

Peu importe si une fonction est statique ou non (méthode de classe). Seules les variables automatiques peuvent être considérées comme locale à une fonction. Si vous avez l'adresse de ces données, vous pouvez y accéder.

Vous pouvez utiliser par exemple de stockage thread local pour affecter votre sortie un contexte de thread dédié.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top