Pergunta

Há muito tempo tinha um desejo para um recipiente stlish que eu poderia colocar em um segmento de memória compartilhada ou um arquivo de memória mapeada.

Eu considerei o uso de um alocador personalizado e posicionamento novo para colocar um recipiente STL regular em um segmento de memória compartilhada. (Como este DDJ artigo ). O problema é que os recipientes de STL terá internamente ponteiros para a memória que eles próprios. Portanto, se o segmento de memória compartilhada ou memória mapeada arquivo carrega em um endereço base diferente (talvez em uma corrida posterior, ou em um segundo processo), então os ponteiros internos são subitamente inválido. Tanto quanto eu posso descobrir, a abordagem alocador personalizado só funciona se você sempre pode mapear o segmento de memória em seu processo no mesmo endereço. Pelo menos com arquivos de memória mapeada, eu tenho muita experiência de que não sendo o caso, se você simplesmente deixar o sistema mapeá-lo onde quer que se sente.

Eu tive alguns pensamentos sobre como fazer isso, mas eu gostaria de evitar que se alguém já fez o trabalho (que sou eu, ser preguiçoso).

Atualmente estou deixando bloqueio de fora da discussão, como a melhor estratégia de bloqueio é altamente dependente da aplicação.

Foi útil?

Solução

O melhor ponto de partida para isso é provavelmente o impulso bibliotecas entre processos. Eles têm um bom exemplo de um mapa na memória compartilhada aqui: entre processos mapear

Você provavelmente também quer ler a seção sobre ponteiros inteligentes compensados, o que resolve o problema ponteiro interno você estava se referindo. offset Pointer

Outras dicas

Você também pode querer fazer o checkout da Intel threading Building Blocks (TBB) Containers.

Eu sempre tive boas experiências (anos) com ACE . É uma estrutura de rede / comunicação, mas tem uma seção sobre memória compartilhada.

Eu só sei de versões proprietárias. Bloomberg e EA têm ambos publicados sobre suas versões STL, mas havent lançado (que eu saiba) os frutos do seu trabalho.

Tente usar Implementação QSharedMemory do Qt.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top