Ich habe eine relativ komplexe Klasse in C ++. Es funktioniert perfekt, wenn es in einem Prozess verwendet wird. Jetzt möchte ich jedoch, dass mehrere Prozesse eine Objektinstanz dieser Klasse gemeinsam nutzen können. Ein Prozess (Master) greift auf Lese- und Schreibfunktionen des Objekts zu, während die anderen beiden Prozesse (Slave) nur die Lesefunktionen verwenden. Ich möchte die Klasse so wenig wie möglich ändern. Bisher habe ich Singletons und Shared Memory in Betracht gezogen, aber keines scheint ideal oder einfach zu sein. Dies ist eine Forschungsanwendung, die nur von mir unter Linux verwendet wird. Was ist die einfachste mögliche Lösung?
Vielen Dank!
Bearbeiten: Um absolut klar zu sein, ist der Fragesteller daran interessiert, ein Objekt über mehrere Prozesse , nicht -Threads zu teilen.
Eine Idee könnte sein, Socket oder eine Socket-Bibliothek zu benutzen, um die Daten zwischen den Prozessen zu teilen. Eine Bibliothek, die dafür sehr praktisch zu sein scheint, könnte ØMQ sein. Sie können auch versuchen, Boost :: Asio zu verwenden, was etwas komplexer ist .
Sie finden ein kleines Beispiel für ØMQ hier .
Die Kommunikation zwischen Prozessen ist nie einfach. Möglicherweise möchten Sie eine Bibliothek für IPC / RPC verwenden und nur die Funktion offenlegen, mit der die Slaves Daten lesen, nicht die gesamte Klasse.
Ich kann Ihnen keine guten Empfehlungen geben, weil ich nie eine Bibliothek gefunden habe, die es einfach gemacht hat und ich habe nicht viel Erfahrung damit.
Eine Option besteht darin, dass der Master- und der Slave-Prozess Instanzen desselben Objekts erstellen. Da der Master-Prozess der einzige sein wird, der dieses "gemeinsam genutzte" Objekt ändert, muss er die Slave-Prozesse nur auf alle Änderungen hinweisen, die er an dem "gemeinsam genutzten" Objekt vornimmt. Um dies zu tun, könnten Sie ein Messagingsystem einrichten, das der Master-Prozess verwenden wird, um Änderungen an dem gemeinsam genutzten Objekt mit den Slave-Prozessen zu kommunizieren. Der Nachteil hierbei ist, dass die Slave-Prozesse auf das gemeinsame Objekt verweisen können, wenn es nicht mit dem Master synchronisiert ist, aber dies ist ein häufiges Problem bei der Replikation. Sie können auch ein RPC-Overlay verwenden, um die Entwicklung / Wartung der Master / Slave-Anwendungen zu erleichtern.
Ich werde versuchen, ein sehr hochwertiges Beispiel dieses Designs unten zu bieten. Verzeih mir, dass ich echten Code und Pseudo-Code Seite an Seite benutze; Ich wollte das nicht komplett kodieren, wollte aber auch nicht, dass es nur aus Kommentaren besteht:)
Hier ist unser gemeinsames Objekt, das im Master / Slave-Code definiert wird
%Vor%Hier ist ein Beispiel für den Master-Prozess, der das gemeinsame Objekt aktualisiert und Änderungen propagiert
%Vor%Hier ist die Funktion, die die Änderungen des Masters an die Slaves weitergibt;
%Vor%Und hier ist der Slave-Code, der diese Änderungen empfängt und sein "gemeinsames" Objekt aktualisiert; höchstwahrscheinlich läuft es in einem anderen Thread, so dass der Slave laufen kann, ohne zu stoppen und nach Objekt-Updates zu suchen.
%Vor%Ich denke, die einfachste Codierungslösung wäre ein Singleton mit einem globalen (oder Klasseninstanz) Mutex, obwohl der Singleton-Teil davon optional ist. Ich persönlich halte Singles für ein überstrapaziertes Idiom. Bis zu Ihnen, ob Sie denken, dass das in diesem Fall gutes Design ist oder nicht. Wirklich, das Hinzufügen des globalen Mutex ist alles was Sie brauchen.
Für den Interprozessabschnitt empfehle ich Boost.