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.

È stato utile?

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.

Conosco solo versioni proprietarie. Bloomberg e EA hanno entrambi pubblicato delle loro versioni STL, ma non ha rilasciato (per quanto ne so) i frutti del loro lavoro.

Prova a utilizzare l'implementazione QSharedMemory di Qt.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top