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 :

Partage d'un singleton


Sujet :

C++

  1. #1
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 1
    Par défaut Partage d'un singleton
    Bonjour à tous

    Le contexte de mon problème est le suivant :
    - je développe en C++ sous Visual Studio 2008
    - ma solution implique plusieurs bibliothèques statiques (.lib) et un nombre limité de bibliothèques dynamiques (.dll) qui se contentent d'exposer des fonction définies dans les (.lib)
    - je définis des singletons dans mes .lib qui sont utilisés employés par les fonctions exposées dans mes .dll
    - l'application qui sert à l'exploitation est réalisée en C# et appelle les fonctions en [DllImport]
    - mon code compile et s'exécute en debug
    - mon code compile en release mais à chaque référence au singleton, une erreur de type "Violation de mémoire" se produit.

    Can anyone help ?

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Bonjour,
    • Si tes singletons sont dans des .lib, tu en as un exemplaire par DLL utilisant la lib, en es-tu bien conscient?
    • Essaie de tester tes DLLs depuis un programme natif, avant de tenter de les tester en .Net.
    • Tu peux aussi faire tes DLLs en C++/CLI, pour les lier directement aux assemblys C# au lieu de passer par P/Invoke...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Par défaut
    Pour un singleton garanti multi-processus / multi-exécutables (ce qui est le cas avec les DLL), tu n'as guère d'autre choix que de l'instancier dans une mémoire partagée...

    Pour ceci, tu effectues les opérations suivantes pour le premier processus :
    • Création de la mémoire partagée et du singleton.
    • Copie du singleton vers la mémoire partagée.
    • Destruction du singleton (la copie en mémoire partagée reste).
    • Assignation de l'adresse du singleton à celle de l'objet en mémoire partagée.

    Pour les suivants, il te suffit d'aller chercher l'adresse du singleton en mémoire partagée. Tu sais que le singleton est initialisé par le simple fait que la mémoire partagée existe. Un mutex nommé (=global au système) protègera la demande d'instance du singleton, afin d'être tranquille sur la réentrance à ce niveau.


    Bien sûr, il te faut protéger ton singleton contre les accès multi-processus, ce qui requiert souvent de stocker une section critique dans la mémoire partagée elle-même, dans ton cas en attribut de la classe singleton par exemple.
    Ta classe ne doit bien sûr avoir aucun attribut de type "pointeur", sinon ça va exploser... Et ceci y compris en pointeur sur la mémoire partagée, car tu ne peux pas garantir qu'elle sera mappée à la même adresse dans tous les processus utilisateurs. Au mieux, tu peux utiliser des offsets dans cette mémoire partagée (par rapport à la classe singleton) et/ou des stockages TLS, si vraiment c'est nécessaire.

    Si tu es process-safe, normalement, tu ne devrais plus avoir le moindre souci d'accès à ton singleton même au travers de C#, il suffira d'appeler au moins une fois la demande d'instance depuis C# pour être certain d'avoir une copie valide du singleton pour ton processus managé.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

Discussions similaires

  1. Partage singleton entre tous les noeuds d'un cluster
    Par laruiss dans le forum Wildfly/JBoss
    Réponses: 0
    Dernier message: 12/12/2009, 16h42
  2. Singleton template partagé entre Dll et Exe
    Par eltrex dans le forum Langage
    Réponses: 1
    Dernier message: 07/08/2008, 12h13
  3. Partager son disque
    Par tintin22 dans le forum Web & réseau
    Réponses: 2
    Dernier message: 16/09/2002, 00h34
  4. Réponses: 4
    Dernier message: 13/05/2002, 16h43
  5. Peux t'on créer une copie locale de l'objet partagé?
    Par Anonymous dans le forum CORBA
    Réponses: 8
    Dernier message: 16/04/2002, 16h20

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