** Nicht-Boost ** STL-Zuweisung für den gemeinsamen Speicher

9

Aufgrund der Richtlinien, bei denen ich arbeite, kann ich keine Version von Boost neuer als 1.33.1 verwenden und kann keine Version von GCC neuer als 4.1.2 verwenden. Ja, es ist Müll, aber ich kann nichts dagegen tun. Boost 1.33.1 enthält die Interprozessbibliothek nicht.

Das heißt, eines meiner Projekte benötigt ein std::map (oder wahrscheinlicher ein std::unordered_map ) im Shared Memory. Es wird nur einmal geschrieben / geändert, wenn der Prozess von einem einzelnen Prozess (dem "Server") geladen und von zahlreichen anderen Prozessen gelesen wird. Ich habe Shared Memory IPC noch nicht gemacht, also ist das für mich ziemlich Neuland. Ich habe mir shmget() angeschaut, aber es scheint, dass ich nicht immer den gleichen Shared-Memory-Schlüssel für die Zuweisung verwenden kann (wie ich bei STL-Containerzuordnern annehmen würde).

Gibt es andere NON-BOOST STL-Zuordner, die gemeinsam genutzten Speicher verwenden?

BEARBEITEN: Dies wurde schon einmal gemacht. Dr. Dobbs hatte bereits 2003 einen Artikel darüber, wie man das genau machen kann , und ich fing an, es als Referenz zu verwenden. Die Codelisten sind jedoch unvollständig und Links zu ihnen führen zur Hauptwebsite.

BEARBEITEN BEARBEITEN: Der einzige Grund, warum ich Boost.Interprocess nicht einfach neu schreibe, ist der Umfang des involvierten Codes. Ich habe mich nur gefragt, ob es etwas relativ Kurzes und Kurzes speziell für POSIX Shared Memory gibt, das ich von Grund auf neu schreiben könnte, da Datenübertragungen zwischen Netzwerken auch einem mehrtägigen Genehmigungsprozess unterliegen ...

    
jvstech 27.09.2012, 02:03
quelle

2 Antworten

5

Zeiger funktionieren nicht im gemeinsam genutzten Speicher, es sei denn, Sie können den gemeinsamen Speicher nicht an einer festen Adresse festhalten (in allen Prozessen konsistent). Daher benötigen Sie bestimmte Klassen, die entweder zusammenhängend sind (kein Zeiger) oder einen Offset (und keinen Zeiger) in den Speicherbereich haben, in dem der gemeinsame Speicher abgebildet ist.

Wir verwenden Shared Memory bei der Arbeit in einer ziemlich ähnlichen Situation: Ein Prozess berechnet eine Menge von Daten, platziert sie im Shared Memory und signalisiert dann den anderen Prozessen, dass sie den Speicher in ihren eigenen Adressraum abbilden können; Der Speicher wird danach nie verändert.

Die Art und Weise, wie wir vorgehen, hat POD -Strukturen (*) (einige enthalten char xxx[N]; -Attribute für den String-Speicher). Wenn Sie Ihre Strings tatsächlich begrenzen können, sind Sie golden. Und so weit wie map geht: Es ist ineffizient für schreibgeschützten Speicher = & gt; Ein sortiertes Array funktioniert besser (Hurra für Speicherlokalität). Also würde ich empfehlen, so zu gehen:

%Vor%

Und dann haben Sie einfach ein Array von std::pair<Key, Value> , das Sie sortieren ( std::sort ) und über das Sie std::lower_bound für Suchvorgänge verwenden. Sie müssen einen Vergleichsoperator für den Schlüssel schreiben, offensichtlich:

%Vor%

Und ich stimme zu, dass der enum + union-Trick weniger ansprechend (Interface-weise) ist als eine Boost-Variante ... es liegt an dir, die Schnittstelle besser zu machen.

(*) Eigentlich ist ein reiner POD nicht notwendig. Es ist vollkommen in Ordnung, private Attribute, Konstruktoren und Kopierkonstruktoren zum Beispiel zu haben. Alles was benötigt wird, ist Indirektion (Zeiger) zu vermeiden.

    
Matthieu M. 27.09.2012, 07:45
quelle
0

Einfache Problemumgehung. Erstelle dein eigenes "libNotBoost v1.0" von Boost 1.51. Die Boost-Bibliothek erlaubt das. Da es nicht mehr Boost ist, geht es dir gut.

    
MSalters 27.09.2012 07:07
quelle

Tags und Links