2009-02-24 10 views
2

J'ai écrit une classe C++ dont j'ai besoin de partager une instance d'au moins deux processus Windows. Quelles sont les différentes façons de le faire?Méthodes de partage d'instances de classe entre les processus

Initialement j'ai regardé dans #pragma data_seg seulement pour être déçu quand j'ai réalisé que cela ne fonctionnera pas sur des classes ou avec n'importe quoi qui alloue sur le tas.

L'instance de la classe doit être accessible via une DLL car les applications complètes existantes utilisent déjà cette DLL.

Répondre

4

Vous pouvez potentiellement utiliser memory-mapped files pour partager des données entre processus. Si vous devez appeler des fonctions sur votre objet, vous devrez utiliser COM ou quelque chose de similaire, ou vous devrez implémenter votre propre protocole RPC.

0

Est-ce un POD ou avez-vous besoin de pouvoir partager une seule instance entre processus? Avez-vous envisagé d'utiliser le pattern Singleton (version d'initialisation statique, pour des raisons de sécurité)? Vous devrez également utiliser Mutex pour protéger les écritures et autres éléments simultanés.

Sous Windows, vous pouvez également utiliser COM.

4

Regardez dans Boost::interprocess. Il faut un peu de temps pour s'y habituer, mais ça marche très bien. J'ai fait des structures de données relativement complexes dans la mémoire partagée qui a bien fonctionné entre les processus.

edit: il fonctionne aussi avec les fichiers mappés en mémoire. Le fait est que vous pouvez utiliser les données de manière structurée; vous n'avez pas besoin de traiter les blocs de mémoire (dans les fichiers ou la mémoire partagée) comme des données brutes que vous devez lire/écrire attentivement pour les laisser dans un état valide. Boost :: interprocess prend en charge cette partie et vous pouvez utiliser des conteneurs STL comme des arbres, des listes, etc.

0

Vous pouvez utiliser placement new pour créer l'objet dans une zone de mémoire partagée. Tant que l'objet n'utilise pas de pointeurs, ça devrait aller.

Questions connexes