Wer noch einen guten Shared-Memory-Container für C ++?
-
06-07-2019 - |
Frage
ich lange habe einen Wunsch nach einem STLish Behälter habe, dass ich in ein Shared-Memory-Segment oder eine Memory-Mapped-Datei einfügen konnte.
Ich habe die Verwendung eines benutzerdefiniertes allocator und Platzierung neuer als einen regulären STL-Container in ein Shared-Memory-Segment zu platzieren. (Wie dieser ddj Artikel ). Das Problem ist, dass STL-Container intern Zeiger hat in den Speicher sie besitzen. wenn das Shared-Memory-Segment oder im Speicher abgebildeten Datei lädt an einer anderen Adresse Basis daher (vielleicht auf einem nachfolgenden Durchlauf oder in einem zweiten Prozess), dann wird die internen Zeiger sind plötzlich ungültig. Soweit ich herausfinden kann, nur der benutzerdefinierte allocator Ansatz funktioniert, wenn Sie immer das Speichersegment in Ihren Prozess an derselben Adresse zuordnen. Zumindest mit Memory-Mapped-Dateien, ich habe viel Erfahrung dieses nicht der Fall sein, wenn Sie nur die Systemkarte lassen Sie es immer, wo es sich anfühlt.
Ich habe einige Gedanken gehabt, wie dies zu tun, aber ich möchte es vermeiden, wenn jemand anderes die Arbeit bereits getan hat (das ist mir, faul).
ich zur Zeit Weglassen der Diskussion sperren, wie die beste Sperrstrategie stark anwendungsabhängig ist.
Lösung
Der beste Ausgangspunkt dafür ist wahrscheinlich die Boost-Inter Bibliotheken. Sie haben ein gutes Beispiel für eine Karte im gemeinsam genutzten Speicher hier: Inter Karte
Sie werden wahrscheinlich wollen auch den Abschnitt Offset intelligente Zeiger lesen, die den internen Zeiger Problem löst Sie sich beziehen waren. Pointer Offset
Andere Tipps
Sie können auch die Intel Threading Building Blocks (TBB) Container .
Ich hatte immer gute Erfahrungen (vor Jahren) mit ACE . Es ist eine Vernetzung / Kommunikation Rahmen, sondern hat einen Abschnitt über den gemeinsamen Speicher.
Versuchen Qt QSharedMemory Implementierung verwendet wird.