Pregunta

Hace tiempo que deseaba un contenedor STLish que pudiera colocar en un segmento de memoria compartida o en un archivo mapeado de memoria.

He considerado el uso de un asignador personalizado y una ubicación nueva para colocar un contenedor STL normal en un segmento de memoria compartida. (como este ddj artículo ). El problema es que los contenedores STL tendrán internamente punteros a la memoria que poseen. Por lo tanto, si el segmento de memoria compartida o el archivo mapeado 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. Hasta donde 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 ese NO es el caso si dejas que el sistema lo mapee donde se siente.

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 fuera de la discusión, ya que la mejor estrategia de bloqueo depende en gran medida de la aplicación.

¿Fue útil?

Solución

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

Probablemente también desee leer la sección sobre punteros inteligentes offset, que resuelve el problema interno del puntero al que se refería. Puntero desplazado

Otros consejos

También es posible que desee consultar Contenedores de Intel Threading Building Blocks (TBB) .

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

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

Intente usar la implementación QSharedMemory de Qt.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top