Je développe une simulation d'évolution darwinienne. Pour des raisons de performance, il est écrit en C ++. La SIM est représentée par une instance de monde. Les animaux sont représentés par des cas d'animal, un objet assez compliqué. Le monde a deux méthodes importantes: et p> animal_at retourne un pointeur brut non nul à l'instance de l'animal qui représente le I -ème animal. Je n'aime pas 1) parce que je devrais introduire un état de "zombie" de l'objet, qui me ressemble à l'habitude.
Je n'aime pas 2) parce que le seul but du proxy est de mettre en œuvre le «dernier moment» sémantique. P> Je cherche une manière non intrusive automatique (en utilisant la génération de code) pour y parvenir, car je Je ne veux pas obscurcir la signification du code d'origine. Y a-t-il un nom "officiel" pour ce que j'appelle "le dernier moment" sémantique? P> p>
Evolue avance la simulation éventuellement
4 Réponses :
Il y a une option d'utilisation de boost :: faible_ptr. Vous pouvez les transmettre, ils doivent utiliser le verrouillage () pour obtenir le sous-jacent Shared_PTR afin qu'ils puissent voir si l'objet n'existe plus. P>
La durée de vie de l'objet est déterminée uniquement par les endroits où se déroulent un partage_ptr. Il doit donc y avoir au moins un d'entre eux à tout moment pendant la durée de vie de l'objet et vous en avez besoin avant de créer un faible. P>
Je vais avoir un regard plus près de Boost :: faible_ptr. La question est, comment va cet interplement avec Corba. Je ne veux pas apprendre Corba juste pour savoir que "Non, Corba ne supporte pas le dernier moment Sémantique". Merci pour la réponse.
Corba utilise son propre comptage de référence avec _VAR et ne prend pas en charge un concept d'un pointeur faible. Je pense que si vous utilisez un objet qui n'existe plus du côté serveur, vous obtenez une exception plutôt qu'un crash. Avec Corba, le concept est que tout le serveur pourrait descendre. Il existe une telle chose qu'une exception transitoire dans laquelle le serveur est en panne, mais les objets ont été créés avec la "persistance" de sorte qu'ils existeront lorsqu'il reviendrait à nouveau.
Premièrement, vous pourriez envisager XML-RPC au lieu de CORBA en tant que middleware (plus d'utilisation standard de nos jours) . P>
Deuxièmement, les utilisateurs externes fonctionnent avec des données marshalérées. Ils envoient une référence marshaled sur le middleware et s'attendent à des informations sur la base de leur demande et de leur référence, donc je ne vois donc pas comment cela fonctionne avec «le dernier moment» de la slemagne et des pointeurs. Vous gardez soit tous vos animaux temporaires, les utilisateurs externes peuvent donc les interroger ou vous devez probablement envoyer beaucoup d'exceptions aux animaux non trouvés. (Ou vous les laissez demander le "dernier" animal) p>
Pour des raisons de performance, je n'ai pas l'intention de marraler tout l'animal. Je souhaite que l'utilisateur externe puisse modifier les membres individuels, les membres des membres, peut-être même invoquer des méthodes de membres de membres, etc. est-ce que XML-RPC est adapté à la communication "naturelle" avec des objets C ++?
Si la référence est l'index i de l'animal (le même indice peut se référer à différents animaux à des moments différents), je dois générer la chaudière «proxy profond» (je refuse d'écrire une chaudière à la main pour des raisons idéologiques). Si la référence est liée à l'identité de l'objet, la partie serveur du middleware doit pouvoir déterminer si l'objet existe toujours (il devrait donc utiliser Boost :: faible_ptr ou ainsi).
XML-RPC n'est pas aussi "naturel" comme corba pour les objets, mais dans les objets finaux sont également passés par la référence de son objet Corba, donc par membre, vous auriez besoin d'un objet qui doit être enregistré / non enregistré et sa référence doit être passé.
Si votre animal_at code> La fonction renvoie un pointeur qui peut être invalidé à tout moment à un moment donné, vous pouvez essayer de le renvoyer un pointeur intelligent (je suggérerais un partagé_ptr code > sur un faible_ptr code> ici, mais vous pouvez vous éloigner avec le pointeur faible si vous faites attention à la mise en œuvre). Cependant, au lieu de pointer directement à un objet code> animal code>, faites-le indiquer un boost :: optionnel invalide code> sur le pointeur et que tout utilisateur de l'objet nouvellement invalidé a la possibilité de vérifier si elles ont besoin d'obtenir un nouveau pointeur. < / p>
Merci pour le boost :: indice en option, je vais y regarder.
Boost :: optionnel ici fait la même chose qui peut être fait par boost :: faible_ptr. Vous stockez votre boost :: Shared_PTR
@Robin Hood: J'ai déclaré que vous pourriez accomplir la même chose avec faible_ptr code> Avez-vous été prudent de la mise en œuvre. Utilisation d'un Shared_ptr p-> valide code>. Comme toujours, il y a plus d'un moyen de peaufiner un chat ...
Je ne comprends pas pourquoi vous souhaitez exporter un pointeur au lieu d'exporter une interface qui semble exactement le «dernier moment» sémantique que vous souhaitez. Votre animal_at code> pourrait renvoyer un objet id em>, pas un pointeur et l'interface donnerait à tous les accès requis à l'objet, tels que dosomething (id, paramètres) < / code>. L'interface pourrait également inclure des trucs de verrouillage / déverrouillage pour permettre l'accès atomique. P>
Bon point sur l'accès atomique. Par "proxy profond", je veux dire exactement cette interface. Les appels ressembleraient à des animaux_proxy (5) .genome.genes [3] .Codones [6] .Dosomething (Param S) Cependant, je ne connais aucun outil pour autogénérer cette interface de la définition de l'animal.
@Pavel: Si votre cible est python, avez-vous considéré quelque chose comme Swig?
J'ai déjà des liaisons de python de travail (faites à l'aide de Py ++), mais je voudrais faire la simulation un composant n'importe quelle langue peut facilement communiquer avec.
@Pavel: Peut-être que je ne vois pas complètement ce que vous voulez, mais Swig soutient de nombreuses langues et est assez couramment utilisé
Pour Python, Py ++ analyse les sources C ++, donc pas besoin de se répéter rédiger le fichier d'interface. Cependant, je souhaite en faire un serveur qui peut être interrogé pour l'interface de manière standard (comme le référentiel d'interface de Corba). Je ne sais toujours pas si 1) ou 2) de ma question initiale est plus appropriée.