Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
693 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Ecrire un conteneur STL dans une mémoire partagée

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Ecrire un conteneur STL dans une mémoire partagée

n°962039
kason
Ab uno disce omnes
Posté le 25-01-2005 à 15:57:58  profilanswer
 

Bonjour,
 
Je souhaite implémenter le conteneur map dans une mémoire partagée, de manière à ce que le contenu du conteneur puisse etre exploité par plusieurs processus en lecture / écriture.
 
Mon pb: comment dois-je copier le conteneur dans la mémoire partagée ? J'ai un pb de lecture et d'écriture pour cet objet.
 
Note: je peux copier sans pb un tableau d'entiers, de structures, sans doute parce que les données sont stockées de manière contigue et sans référence à des adresses de mémoire. Mais pour un conteneur de la STL, problème !  :(  
 
Je suis sous Linux Red Hat 7.2. J'utilise le c++ standard.  :jap:  
 
kason  :hello:

mood
Publicité
Posté le 25-01-2005 à 15:57:58  profilanswer
 

n°962048
HelloWorld
Salut tout le monde!
Posté le 25-01-2005 à 16:02:22  profilanswer
 

Il te faut créer ton propre allocateur et le filer en dernier paramètre template à ton map.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°962057
kason
Ab uno disce omnes
Posté le 25-01-2005 à 16:07:26  profilanswer
 

Que devra contenir ce nouveau allocateur par rapport à l'allocateur par défaut ? En fait, je ne vois pas ce que je dois modifier dans la classe Allocator de base...

n°962062
schnapsman​n
Zaford Beeblefect
Posté le 25-01-2005 à 16:11:04  profilanswer
 

HelloWorld a écrit :

Il te faut créer ton propre allocateur et le filer en dernier paramètre template à ton map.


nan, enfin pas obligatoirement/seulement.
 
il faut utiliser l'opérateur new "in place", dont la syntaxe est la suivante:

MonType* = new (addr_shm) MonType();


avec ça new ne fait pas l'allocation mémoire, et se contente d'apeller le constructeur sur l'addresse mémoire qu'on lui donne.


Message édité par schnapsmann le 25-01-2005 à 16:14:24

---------------
From now on, you will speak only when spoken to, and the first and last words out of your filthy sewers will be "Sir!"
n°962078
kason
Ab uno disce omnes
Posté le 25-01-2005 à 16:33:31  profilanswer
 

Je voudrais en savoir plus sur la classe Allocator de la librairie STL.  
 
Permet-elle d'organiser la position et la structure des éléments du conteneur dans la mémoire (itérateurs, données, etc) ?

n°962080
schnapsman​n
Zaford Beeblefect
Posté le 25-01-2005 à 16:34:53  profilanswer
 

kason a écrit :

Je voudrais en savoir plus sur la classe Allocator de la librairie STL.  
 
Permet-elle d'organiser la position et la structure des éléments du conteneur dans la mémoire (itérateurs, données, etc) ?


as tu seulement pipé un mot de mon post déjà? [:petrus75]


---------------
From now on, you will speak only when spoken to, and the first and last words out of your filthy sewers will be "Sir!"
n°962085
Lam's
Profil: bas.
Posté le 25-01-2005 à 16:40:59  profilanswer
 

schnapsmann a écrit :

as tu seulement pipé un mot de mon post déjà? [:petrus75]


Ceci dit schnapsmann, la difficulté, c'est pas tant d'allouer l'objet map, que de lui dire comment ensuite allouer les noeuds de son arbre red-black. Donc un allocateur pour shared-memory s'impose...
 
Mais je crois bien qu'il y a un outil qui s'appelle google qui pourrait nous en apprendre un peu plus sur les allocateurs de la STL...


Message édité par Lam's le 25-01-2005 à 16:41:32
n°962090
schnapsman​n
Zaford Beeblefect
Posté le 25-01-2005 à 16:45:59  profilanswer
 

Lam's a écrit :

Ceci dit schnapsmann, la difficulté, c'est pas tant d'allouer l'objet map, que de lui dire comment ensuite allouer les noeuds de son arbre red-black. Donc un allocateur pour shared-memory s'impose...


oui bien sur, ceci dit le commencement c'est bien le new in place, et effectivement un allocateur redéfini est obligatoire


---------------
From now on, you will speak only when spoken to, and the first and last words out of your filthy sewers will be "Sir!"
n°962091
HelloWorld
Salut tout le monde!
Posté le 25-01-2005 à 16:46:36  profilanswer
 

schnapsmann> vu qu'en interne std::map va faire des allocs, ça me parrait obligatoire.  
 
Y'a pas de classe Allocator utilisable comme tu sembles le penser, c'est juste une interface de manipulation pour la STL. Tu dois en implémenter une autre que celle fournie par défaut (std::allocator), donc tu le fais comme tu veux. Tu peux faire des allocations dans un fichier, sur un ordi distant via tcp/ip si ça te dit.
http://www.roguewave.com/support/d [...] /12-6.html


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°962097
bjone
Insert booze to continue
Posté le 25-01-2005 à 16:49:57  profilanswer
 

mmmmm.... et au niveau adressage ne risque-t-il pas y avoir de problème lorsque l'arbre sera parcouru ? (question pour moi)
 
mais si tu prends deux process différents (pas issu d'un fork), ça risque de pêter les plombs au niveau adressage (ou il alors il faudrait un adressage relatif au début de la mémoire partagée) ?

mood
Publicité
Posté le 25-01-2005 à 16:49:57  profilanswer
 

n°962104
schnapsman​n
Zaford Beeblefect
Posté le 25-01-2005 à 16:53:16  profilanswer
 

bjone a écrit :

mmmmm.... et au niveau adressage ne risque-t-il pas y avoir de problème lorsque l'arbre sera parcouru ? (question pour moi)
 
mais si tu prends deux process différents (pas issu d'un fork), ça risque de pêter les plombs au niveau adressage (ou il alors il faudrait un adressage relatif au début de la mémoire partagée) ?


 
la cohérence des addresses dans la shm est assurée par le système, et les pointeurs restent valables d'un process à l'autre (sauf si tu t'amuses à stoquer un pointeur vers l'espace privé d'un process dans la shm)


---------------
From now on, you will speak only when spoken to, and the first and last words out of your filthy sewers will be "Sir!"
n°962105
HelloWorld
Salut tout le monde!
Posté le 25-01-2005 à 16:53:45  profilanswer
 

Oui y'a d'autres contraintes liées au multitache et aux accès concurrents...


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°962147
++fab
victime du syndrome IH
Posté le 25-01-2005 à 17:19:42  profilanswer
 

ça existe à cette adresse :
http://allocator.sourceforge.net/

n°962174
docmaboul
Posté le 25-01-2005 à 17:59:25  profilanswer
 

schnapsmann a écrit :

la cohérence des addresses dans la shm est assurée par le système, et les pointeurs restent valables d'un process à l'autre


 
Non. Rien ne vous garantit que n'importe quel os va toujours mapper le segment à la même adresse virtuelle dans chaque processus. En d'autres termes, la seule manière d'être à la fois safe et portable, c'est d'utiliser, d'une manière ou d'une autre, des adresses relatives à l'adresse du début du segment.
 


NOTES
       Using shmat with shmaddr equal to NULL is the preferred,  portable  way
       of  attaching a shared memory segment.  Be aware that the shared memory
       segment attached in this way may be attached at different addresses  in
       different  processes.   Therefore,  any  pointers maintained within the
       shared memory must be made relative (typically to the starting  address
       of the segment), rather than absolute.

n°962185
schnapsman​n
Zaford Beeblefect
Posté le 25-01-2005 à 18:24:33  profilanswer
 

DocMaboul a écrit :

Non. Rien ne vous garantit que n'importe quel os va toujours mapper le segment à la même adresse virtuelle dans chaque processus. En d'autres termes, la seule manière d'être à la fois safe et portable, c'est d'utiliser, d'une manière ou d'une autre, des adresses relatives à l'adresse du début du segment.
 


NOTES
       Using shmat with shmaddr equal to NULL is the preferred,  portable  way
       of  attaching a shared memory segment.  Be aware that the shared memory
       segment attached in this way may be attached at different addresses  in
       different  processes.   Therefore,  any  pointers maintained within the
       shared memory must be made relative (typically to the starting  address
       of the segment), rather than absolute.



 
oui, au temps pour moi, c'est vrai uniquement avec des process clonés par fork qui s'attacheraient à la shm avant de forker comme le disait bjone; mais de toutes façons il vaut mieux utiliser des pointeurs relatifs.


Message édité par schnapsmann le 25-01-2005 à 18:24:55

---------------
From now on, you will speak only when spoken to, and the first and last words out of your filthy sewers will be "Sir!"
n°962227
docmaboul
Posté le 25-01-2005 à 19:14:09  profilanswer
 

schnapsmann a écrit :

oui, au temps pour moi, c'est vrai uniquement avec des process clonés par fork qui s'attacheraient à la shm avant de forker comme le disait bjone; mais de toutes façons il vaut mieux utiliser des pointeurs relatifs.


 
Oui. D'ailleurs, dans la même veine, il faut faire plutôt attention à la shared en C++ pour les classes ayant une vtable car rien ne garantit non plus que l'adresse sera la même dans tous les processus.

n°962417
HelloWorld
Salut tout le monde!
Posté le 25-01-2005 à 23:34:24  profilanswer
 

Y'avait eu un topic là dessus.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Ecrire un conteneur STL dans une mémoire partagée

 

Sujets relatifs
Garder le résultat d'une requete en mémoire avec PHP[C#] Ouvrir un fichier texte et écrire dedans avec "WriteLine()"
Utilisation mémoire importante[CSS] Positionnement flottant, hauteur du conteneur
N ème plus grand élément d'un conteneur sequentiel avec la STD libChargement d'un programme en mémoire
STL C++ mise à jourDreamweaver : Je n'arrive pas a écrire du texte au milieu de la page
Ecrire dans le biosLibération de mémoire qui ne se fait pas...
Plus de sujets relatifs à : Ecrire un conteneur STL dans une mémoire partagée


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR