web-dev-qa-db-fra.com

Meilleur moyen de communication interprocessus en C ++

J'ai deux processus dont l'un interrogera les autres pour les données.Il y aura une énorme quantité de requêtes dans un temps limité (10000 par seconde) et les données (> 100 Mo) seront transférées par seconde.Le type de données sera un type intégral (double , int) Ma question est de savoir comment connecter ce processus?

Mémoire partagée, file d'attente de messages, lpc (appel de procédure locale) ou autres ....

Et aussi je veux demander quelle bibliothèque vous proposez? au fait, veuillez ne pas suggérer MPI. modifier: sous windows xp 32 bits

38
Qubeuc

Un mot: Boost.InterProcess . Si elle doit vraiment être rapide, la mémoire partagée est la solution. Vous avez presque zéro surcharge, car le système d'exploitation effectue le mappage habituel entre les adresses virtuelles et physiques et aucune copie n'est requise pour les données. Il vous suffit de rechercher les problèmes de concurrence.

Pour envoyer des commandes comme shutdown et query , j'utiliserais des files d'attente de messages . J'ai déjà utilisé la programmation réseau localhost pour ce faire, et utilisé l'allocation manuelle de mémoire partagée, avant de connaître boost. Merde, si j'avais besoin de réécrire l'application, je choisirais immédiatement Boost. Boost.InterProcess vous facilite la tâche. Vérifiez-le.

40

J'utiliserais la mémoire partagée pour stocker les données et les files d'attente de messages pour envoyer les requêtes.

6
Marc

Si vos données se composent de plusieurs types et/ou si vous avez besoin de choses comme mutex, utilisez Boost. Sinon, utilisez une section de mémoire partagée en utilisant #pragma data_seg ou un fichier mappé en mémoire.

4
EhevuTov

Je seconderai la suggestion de Marc - je ne m'embêterais pas avec boost sauf si vous avez un problème de portabilité ou si vous voulez faire des trucs sympas comme mapper des types de conteneurs standard sur la mémoire partagée (auquel cas j'utiliserais certainement boost).

Sinon, les files d'attente de messages et la mémoire partagée sont assez simples à gérer.

4
tafkaks

Si vous utilisez la mémoire partagée, vous devrez décider de tourner ou non. Je m'attends à ce que si vous utilisez un sémaphore pour la synchronisation et le stockage de données dans la mémoire partagée, vous n'obtiendrez pas beaucoup d'avantages en termes de performances par rapport à l'utilisation de files d'attente de messages (avec une dégradation de la clarté significative), mais si vous tournez sur une variable atomique pour la synchronisation, alors vous doivent en subir les conséquences.

3
Greg Rogers