2008-11-04 17 views
8

Hace mucho que deseaba un contenedor STLish que pudiera colocar en un segmento de memoria compartida o en un archivo mapeado en memoria.¿Alguien tiene un buen contenedor de memoria compartida para C++?

He considerado el uso de un asignador personalizado y una ubicación nueva para colocar un contenedor STL regular en un segmento de memoria compartida. (como este ddj article). El problema es que los contenedores STL tendrán internamente indicadores de la memoria que poseen. Por lo tanto, si el segmento de memoria compartida o el archivo asignado de memoria se carga en una dirección base diferente (tal vez en una ejecución posterior, o en un segundo proceso), los punteros internos son repentinamente inválidos. Por lo que puedo entender, el enfoque del asignador personalizado solo funciona si siempre puede asignar el segmento de memoria a su proceso en la misma dirección. Al menos con los archivos mapeados en memoria, tengo mucha experiencia de que NO es el caso si solo dejas que el sistema lo trace donde lo desee.

He tenido algunas ideas sobre cómo hacer esto, pero me gustaría evitarlo si alguien más ya ha hecho el trabajo (ese soy yo, siendo flojo).

Actualmente estoy dejando el bloqueo de la discusión, ya que la mejor estrategia de bloqueo depende en gran medida de la aplicación.

Respuesta

12

El mejor punto de partida para esto es probablemente el impulso de las bibliotecas de Interprocess. Tienen un buen ejemplo de un mapa en la memoria compartida aquí: interprocess map

Probablemente también desee leer la sección sobre punteros inteligentes de desplazamiento, que resuelve el problema del puntero interno al que se estaba refiriendo. Offset Pointer

+1

Apoyo esta respuesta mediante la experiencia personal. ¡La guía en línea hecha usando IPC es muy fácil! www.boost.org/doc/libs/1_36_0/doc/html/interprocess/quick_guide.html www.boost.org/doc/libs/1_36_0/doc/html/interprocess/sharedmemorybetweenprocesses.html#interprocess.sharedmemorybetweenprocesses.mapped_file – pestophagous

0

Siempre tuve buenas experiencias (hace años) con ACE. Es un marco de trabajo en red/comunicación, pero tiene una sección sobre memoria compartida.

0

Solo conozco las versiones propietarias. Bloomberg y EA han publicado sobre sus versiones de STL, pero no han publicado (que yo sepa) los frutos de su trabajo.

+0

Es engañoso caracterizar las bibliotecas "BDE" que el equipo de Lakos desarrolló en Bloomberg como una "versión STL": las interfaces y los compromisos son muy diferentes. –

-1

Intente utilizar Qt's QSharedMemory Implementation.

+0

Acabo de mirar QSharedMemory, solo proporciona acceso a memoria compartida, no da contenedores de ningún tipo. –

+0

de acuerdo. Mi error. Implementé una cola de mensajes de tamaño fijo sobre ella. –

Cuestiones relacionadas