Qualcuno ha un buon contenitore di memoria condivisa per C ++?
-
06-07-2019 - |
Domanda
Ho sempre desiderato un contenitore STLish che potessi collocare in un segmento di memoria condivisa o in un file mappato in memoria.
Ho considerato l'uso di un allocatore personalizzato e il posizionamento nuovi per posizionare un normale contenitore STL in un segmento di memoria condivisa. (come questo ddj article ). Il problema è che i contenitori STL avranno internamente puntatori alla memoria di loro proprietà. Pertanto, se il segmento di memoria condivisa o il file mappato in memoria vengono caricati in un indirizzo di base diverso (forse in un'esecuzione successiva o in un secondo processo), i puntatori interni sono improvvisamente non validi. Per quanto ne so, l'approccio dell'allocatore personalizzato funziona solo se puoi sempre mappare il segmento di memoria nel tuo processo allo stesso indirizzo. Almeno con i file mappati in memoria, ho molta esperienza che NON è il caso se lasci che il sistema lo mappi dove mai ti sembra.
Ho pensato a come farlo, ma vorrei evitarlo se qualcun altro ha già svolto il lavoro (sono io, essere pigro).
Attualmente sto abbandonando il blocco della discussione, poiché la migliore strategia di blocco dipende fortemente dall'applicazione.
Soluzione
Il miglior punto di partenza per questo è probabilmente il potenziamento delle librerie Interprocess. Hanno un buon esempio di mappa nella memoria condivisa qui: interprocess map
Probabilmente vorrai anche leggere la sezione sui puntatori intelligenti offset, che risolve il problema del puntatore interno a cui ti riferivi. Puntatore offset
Altri suggerimenti
Potresti anche voler controllare Contenitori Intel Threading Building Blocks (TBB) .
Ho sempre avuto buone esperienze (anni fa) con ACE . È un framework di rete / comunicazione, ma ha una sezione sulla memoria condivisa.
Prova a utilizzare l'implementazione QSharedMemory di Qt.