2010-03-11 31 views
3

Je suis étant particulièrement dense à ce sujet mais il semble que je manque un point de base importante, ou quelque chose, puisque ce que je veux faire devrait être commune:Pourquoi créer un tampon circulaire partagé par différents processus si dur (en C++), qu'est-ce que je fais de mal?

Je dois créer un objet tampon circulaire de taille fixe de un processus gestionnaire (Process M). Cet objet a write() et read() méthodes pour écrire/lire à partir du tampon. Lecture/méthodes d'écriture seront appelés par des processus indépendants (Process R et W)

J'ai mis en place le tampon, SharedBuffer<T&>, il alloue des tranches tampons en SHM utilisant boost :: interprocessus et fonctionne parfaitement dans un seul processus. J'ai lu les réponses à this question et that one sur SO, ainsi que demandé my own, mais je suis toujours dans le noir sur la façon d'avoir différents processus d'accès à des méthodes à partir d'un objet commun. Le document Boost a un exemple de creating a vector in SHM, ce qui est très similaire à ce que je veux, mais je veux instancier ma propre classe.

Mes options actuelles sont:

  1. Utilisez le placement new, comme suggéré par Charles B. à my question; Cependant, il prévient que ce n'est pas une bonne idée de mettre des objets non-POD dans SHM. Mais ma classe a besoin des méthodes de lecture/écriture, comment puis-je les gérer?
  2. Ajoutez un allocateur à ma définition de classe, par ex. avoir SharedBuffer<T&, Alloc> et procéder de manière similaire à la vector example donnée en boost. Cela semble vraiment compliqué.
  3. Remplacez SharedBuffer par une classe POD, c'est-à-dire supprimez toutes les méthodes. Mais alors comment synchroniser la lecture et l'écriture entre les processus?

Que manque-t-il? Les tampons en anneau de longueur fixe sont très courants, donc soit ce problème a une solution, soit je fais quelque chose de mal.

+0

Je vais ajouter # 4 - écrire un processus serveur pour gérer les données. La règle de base concernant les logiciels multiprocessus est que quelque chose (c'est-à-dire un processus) doit être en charge d'une ressource partagée. –

+0

Exactement. C'est ce que je visais avec le processus de gestion qui va créer le tampon, vérifier à quel point il est plein, etc. – recipriversexclusion

+1

Mais si vous avez un tel processus, toutes les questions de placement nouveau, utilisation de mémoire partagée etc. disparaissent. Vous avez bien sûr de nouveaux problèmes intéressants comme la façon de parler au serveur, mais ceux-ci sont bien compris dans le secteur. –

Répondre

1

Le tampon circulaire n'est pas un problème ici, en utilisant la mémoire partagée est. La solution à cela est d'utiliser le placement nouveau pour allouer votre objet, ou au moins pour l'allocation d'un tampon interne de celui-ci. Le simple fait d'avoir des fonctions membres, des constructeurs et des destructeurs ne devrait pas causer de problèmes, mais assurez-vous de ne pas utiliser de fonctions virtuelles ou de ne pas contenir d'objets non-POD, car cela pourrait être compliqué.

+1

Les fonctions virtuelles ne fonctionneront pas du tout, et il n'y a aucun moyen de les faire fonctionner. –