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 :

création d'objet en mémoire partagé


Sujet :

C++

  1. #1
    Membre habitué Avatar de BigNic
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 195
    Points : 154
    Points
    154
    Par défaut création d'objet en mémoire partagé
    -Quelqu'un sait-il s'il est possible de créer des objets (entier sans sérialiser) en mèmoire partagé ?
    - Si oui comment faire ?
    - Comment spécifié à l'opérateur new que cette objet doit être alloué en mémoire partager ?
    - Est-ce possible de créer des objet de taille variable (objet s'occupant lui même d'allouer la mémoire pour ces données) ?

    toute redirection vers des articles sur le net serait bienvenu (même si j'ai déjà cherché et lu ce que j'ai trouvé).
    Wink

    [sujet déplacé par Katyucha, en provenance du forum Linux]

  2. #2
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 752
    Points : 10 681
    Points
    10 681
    Billets dans le blog
    3
    Par défaut
    Les conteneurs de la STL utilisent un allocateur. Tu peux créer le tiens qui alloue en mémoire partagée. En fait, y'a un projet de ce type qui existe déjà, pour Linux:
    http://allocator.sourceforge.net/
    sinon tu peux créer ton propre opérateur new.

  3. #3
    Membre éprouvé Avatar de Caine
    Inscrit en
    Mai 2004
    Messages
    1 028
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 028
    Points : 1 122
    Points
    1 122
    Par défaut
    Le partage mémoire est fortement dépendant du système d'exploitation.

    Tu travailles sur quel SE ?

  4. #4
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par BigNic
    -Quelqu'un sait-il s'il est possible de créer des objets
    (entier sans sérialiser) en mémoire partagée ?
    - Si oui comment faire ?
    Je vois deux niveaux a ta question, et je ne sais pas auquel il faut
    repondre. Dans le premier niveau, il y a l'optention de la memoire
    partagee et l'organisation de celle-ci pour que les deux processus
    communiquent sans se marcher sur les pieds, y compris les besoins eventuels
    de synchronisation. Je ne vais pas traiter de ce niveau et supposer que tu
    as deja ecrit une interface du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    class area;
    void* alloc_shared(area&, size_t sz);
    void free_shared(area&, void* ptr);
    Le deuxieme niveau, c'est comment utiliser cette memoire dans un programme
    C++. Avant de traiter ce point, il faut savoir que tu seras
    vraissemblablement limite dans ce que tu peux mettre en memoire partagee.
    Les objets qui ont des membres virtuels, contiennent un pointeur vers un
    descripteur de type. Ce pointeur ne sera pas valable d'un processus a
    l'autre hors le fonctionnement des membres virtuels en a besoin. Donc si
    tu tentes de mettre en memoire partagee ces objets, tu auras au mieux des
    crashs, au pire des comportements bizarres.

    - Comment spécifier à l'opérateur new que cette objet doit être
    alloué en mémoire partagee ?
    Un entete
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void* operator new(size_t, area&);
    void operator delete(size_t, area&) throw();
    template<typename T>
    void free_shared_object(area& a, T* ptr) {
       try {
          ptr->~T();
       } catch(...) {
          free_shared(a, ptr);
          throw;
       }
       free_shared(a, ptr);
    }
    Et du code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void* operator new(size_t sz, area& a)
    {
       void* res = alloc_shared(a, sz);
       if (res == 0)
          throw std::bad_alloc();
       return sz;
    }
    void operator delete(area& a, void* ptr) throw()
    {
       free_shared(ptr);
    }
    et un exemple d'utilisation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    maClasse* monPointeur = new(monArea) maClasse;
    ...
    free_shared_object(monArea, maClasse);
    Il n'y a pas de syntaxe pour appeler l'operateur delete surcharge prenant
    aussi un area, mais il est necessaire (il est appele automatiquement si le
    constructeur de maClasse quitte par une exception).

    Si tu veux pouvoir allouer des tableaux, il faut faire de meme pour les
    operateur new[] et delete[] et free_shared_array.

    - Est-ce possible de créer des objet de taille variable (objet
    s'occupant lui même d'allouer la mémoire pour ces données) ?
    Tu peux faire une classe qui prend un area pour indiquer ou il faut allouer
    les donnees. Tu peux fournir aussi une interface pour que ce soit des
    allocateurs valables pour les conteneurs de la SL.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  5. #5
    Membre habitué Avatar de BigNic
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 195
    Points : 154
    Points
    154
    Par défaut
    Citation Envoyé par Caine
    Le partage mémoire est fortement dépendant du système d'exploitation.

    Tu travailles sur quel SE ?
    je bosse sur du unix (linux, solaris,...)
    D'ailleurs originellment le post était sur le forum Linux, d'où mon imprecision

  6. #6
    Membre éprouvé Avatar de Caine
    Inscrit en
    Mai 2004
    Messages
    1 028
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 028
    Points : 1 122
    Points
    1 122
    Par défaut
    Bon alors je

    Je suis spécialiste de la qustion sous Windows surtout.

    Mais, il y a un système de sémaphore sous Unix. Bonne continuation.

    Il serait bien que le post revienne dans le bon forum

  7. #7
    Membre habitué Avatar de BigNic
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 195
    Points : 154
    Points
    154
    Par défaut
    merci pour vos réponses. Les choses sont un peu plus claires pour moi. Même si cela présage pas mal de boulot.

Discussions similaires

  1. Problème mémoire : création d'objets Double d'origine inconnue
    Par lemmingou2010 dans le forum Général Java
    Réponses: 1
    Dernier message: 09/10/2011, 02h10
  2. Création sémaphore et mémoire partagée python
    Par geek44 dans le forum Général Python
    Réponses: 2
    Dernier message: 10/05/2008, 03h00
  3. Réponses: 17
    Dernier message: 02/02/2006, 12h03
  4. [FLASH MX2004] Création d'objet dynamiquement
    Par noarno dans le forum Flash
    Réponses: 3
    Dernier message: 15/12/2004, 11h00
  5. [CR][paradox] mémoire partagée disponible insuffisante !
    Par AGT dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 24/03/2004, 14h27

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