IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Singleton monothread indépendant


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Inscrit en
    Janvier 2009
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 32
    Par défaut Singleton monothread indépendant
    Bonjour à tous,

    Je travaille actuellement sur une classe Design Pattern (ou Singleton).

    Il se peut que plusieurs threads aient besoin d'utiliser ce Singleton mais de façon indépendante.

    En fait, je ne voudrais pas qu'ils se partagent le singleton mais qu'il y ai un singleton unique par thread.

    J'ai essayé en essayant de récupérer l'id du thread en cours (numéro unique) et donc de recréer le singleton par thread mais alors, je ne sais plus quand le supprimer et je ne sais pas trop si c'est sûr.

    Avez vous une idée ?

    Merci.

  2. #2
    Membre chevronné Avatar de jacky01
    Profil pro
    Développeur .NET
    Inscrit en
    Juin 2007
    Messages
    537
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2007
    Messages : 537
    Par défaut
    Salut,

    Pourquoi ne pas créer de destructeur paramétrer avec l'id du thread afin de détruire seulement l'objet concerné.(biensure ton objet devra avoir une proprioté du genre )
    Après pour l'appel du destructeur à toi de trouvé le moment idéal, soit une fois que tu est sur de ne plus avoir besoin de ton objet ou alors en fin de vie de ton thread.

    Ce n'est qu'une proposition, je ne l'ai jamais mis en place.

  3. #3
    Membre chevronné Avatar de npuzin
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    265
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2007
    Messages : 265
    Par défaut
    Je n'ai pas le code en tete, mais tu peux peut etre utiliser la memoire du Thread avec ce genre de code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    LocalDataStoreSlot myTLSValue;	
    myTLSValue=Thread.GetNamedDataSlot("SleepTime");
    int tlsValue=(int)Thread.GetData(myTLSValue);

  4. #4
    Membre actif
    Inscrit en
    Janvier 2009
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 32
    Par défaut
    Merci pour vos réponses.
    Je n'ai pas bien compris ton bout de code npuzin même si j'ai bien l'impression que c'est ce que je recherche. C'est à dire, créer le singleton seulement dans la mémoire du thread pour qu'il ne soit pas partagé avec les autres threads. Mais peux-tu être un peu plus explicite ?
    Merci

    En fait, ce que j'ai surtout peur c'est que de créer un dictionary avec <int id_thread, object instanceSingleton>, va devenir trop lourd en temps de calcul surtout si on prends l'habitude d'utiliser notre singleton par la classe.

    Si on utilise notre singleton de cette manière :
    Singleton.instanceSingleton
    alors il y aura dans mon Getter, une recherche dans le dictionaire en fonction de l'id du thread....

    Alors que si on utilise :
    Object monSingleton = Singleton.instanceSingleton
    et qu'on se sert de monSingleton dans la méthode ensuite, cela diminuera considérablement le temps de calcul car l'appel au dictionaire se fera qu'une seule fois lorsqu'on en as besoin.

    Sauf que je ne peux pas être sur de la façon dont sera utilisé ce singleton !

    Mon problème c'est que j'aimerai savoir s'il serait possible de directement limiter ce singleton au thread sans avoir à créer un objet lourd (avec id_thread, une liste ou un dictionnaire, etc.).

  5. #5
    Membre Expert Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Par défaut
    Me semble que s'il y en a plusieurs, c'est plus un singleton
    Et l'accès à un dico est en o(1). Même si tu avais un millier de thread, la différence par rapport à une référence directe est trèèèès négligeable par rapport au reste de ton code.

    A titre indicatif, pourquoi veux-tu avoir une instance différente de cette classe par thread ? Parce que là, c'est plus un singleton, chaque instance ayant bien sûr ses propres membres.

  6. #6
    Membre chevronné Avatar de npuzin
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    265
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2007
    Messages : 265
    Par défaut
    Voici comment tu peux declarer ton singleton.

    Au lieu d'instancier ton singleton et l'enregistrer dans une variable static comme on fait d'habitude, tu places ton instance dans la memoire du thread.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
        public class MySingleton
        {        
            private MySingleton()
            {}
            public static MySingleton Instance
            {
                get
                {
                    LocalDataStoreSlot mySingletonInstanceSlot = 
                        Thread.GetNamedDataSlot("MySingletonInstance");
                    MySingleton instance = (MySingleton) Thread.GetData(mySingletonInstanceSlot);
                    if (instance == null)
                    {
                        // Put the new singleton instance onto the thread local storage
                        instance = new MySingleton();
                        Thread.SetData(mySingletonInstanceSlot, instance);
                        return instance;
                    }
                    else // returning existing instance from the thread local storage
                    {
                        return instance;
                    }
                }
            }
        }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Singleton MonoThread
    Par christopheJ dans le forum Codes sources à télécharger
    Réponses: 0
    Dernier message: 10/03/2011, 13h36
  2. [DROIT] Consultant indépendant et Assedics
    Par BuLma dans le forum Licenciement
    Réponses: 12
    Dernier message: 14/12/2003, 01h25
  3. [SQL] Compter des champs indépendement l'un de l'autre
    Par rippey dans le forum Requêtes et SQL.
    Réponses: 11
    Dernier message: 29/10/2003, 15h35
  4. [Migratation] Application portable, indépendant du SGDB
    Par benouille dans le forum Décisions SGBD
    Réponses: 6
    Dernier message: 28/08/2002, 13h51
  5. Cherche composant Web Browser indépendant
    Par lancelot69 dans le forum Composants VCL
    Réponses: 2
    Dernier message: 31/07/2002, 11h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo