10
votes

Puis-je transmettre un objet à un autre processus qui passe simplement son "pointeur à une mémoire partagée?

J'ai une classe très compliquée (il a un désordred_map et ainsi de suite à l'intérieur de l'intérieur) et je veux partager un objet de celui-ci avec deux mes processus. Puis-je simplement passer simplement un pointeur à un processus à un autre? Je pense que non, mais j'espère entendre "oui!".

Si "Non", je serais reconnaissant de voir des liens comment faire face dans de tels cas. Je n'ai besoin que d'une seule instance de cet objet pour tous les processus, car il est très important et que tous les processus vont fonctionner pour la lecture seule.


2 commentaires

@If vous avez le contrôle de ces processus, pourquoi ne pas les transformer en threads? Le partage de la mémoire est plus facile que. Semble plus judicieux puisqu'il s'agit de la connaissance de leurs données de données internes (vous avez partagée)


Oui, je pense que je vais aller de cette façon. Et j'ai demandé à la question de m'assurer que je n'ai aucune solution facile avec IPC.


6 Réponses :


5
votes

Non, processus ne ( Naturally ) partage la mémoire. Si Boost est une option, vous pouvez donc consulter Boost.interprocess pour un partage facile de la mémoire.


0 commentaires

4
votes

Non, le pointeur n'a pas de sens pour l'autre processus. Le système d'exploitation crée un espace d'adressage séparé pour d'autres processus; Par défaut, ils n'ont aucune idée que d'autres processus fonctionnent, voire qu'une telle chose est possible.


1 commentaires

C'est une réponse que j'étais prêt mais espéré là-bas peut y avoir une astuce :(



0
votes

L'astuce ici est que la mémoire doit être mappée de la même manière dans vos deux processus. Si votre mémoire partagée mappée peut être organisée de cette façon, cela fonctionnera, mais je parie que ce sera très difficile.

Il y a quelques possibilités d'autres possibilités. Premier est d'utiliser un tableau; Les indices de tableau seront les deux processus.

Vous pouvez également utiliser placement nouveau pour faire Bien sûr, vous allociez des objets dans un emplacement connu dans la mémoire partagée et utilisez ces compensations.


0 commentaires

0
votes

Si vous êtes sous Linux, vous pouvez utiliser une mémoire partagée pour stocker des données communes entre les processus. Pour le cas général, jetez un coup d'œil à Boost IPC Bibliothèque.

Mais le pointeur d'un processus ne peut pas être utilisé dans une autre (il est d'utiliser une adresse, si vous accédez à IO, ou à certains périphériques spéciaux)


0 commentaires

0
votes

Si vous utilisez qt4, il y a QsharedMemory ou vous pouvez utiliser des sockets et un protocole de sérialisation personnalisé .


0 commentaires

14
votes

Vous pouvez certainement utiliser IPC pour y accomplir, et il existe de nombreux cas où plusieurs processus ont plus de sens qu'un processus multithread (au moins un des processus est construit sur un code hérité sur lequel vous ne pouvez pas apporter de nombreuses modifications, Ils seraient mieux écrits dans différentes langues, vous devez minimiser les chances de défauts dans un processus affectant la stabilité des autres, etc.) Dans un environnement compatible POSIX, vous feriez

int descriptor = shm_open("/the_same_name_here", O_RDWR | O_CREAT, 0777);

if (descriptor < 0) {
    /* handle error */
} else {

  Object *obj = (Object *) mmap(NULL, sizeof(Object), PROT_READ | PROT_WRITE | PROT_EXEC, MAP_SHARED, descriptor, 0);

  if (!obj || obj == MAP_FAILED)
      /* handle error */ ;
}


2 commentaires

Si je construisais un objet avec un nouvel opérateur de placement, il construira-t-il automatiquement ses membres avec le même opérateur?


Les membres non-pointeurs seront bien sûr construits à l'intérieur de l'espace alloué à l'objet parent. Si vos constructeurs de classe ou d'autres méthodes utilisent de nouvelles pour allouer de l'espace pour d'autres objets, cette mémoire sera / non / soyez à l'intérieur du blob partagé. Comme indiqué dans la première balle, cela peut être une source majeure de complexité et d'erreurs. Si vos objets partagés sont trop complexes pour éviter manuellement ce comportement, vous pouvez rechercher un nouvel opérateur personnalisé qui alloue à l'intérieur du blob lorsqu'un drapeau global particulier est défini.