Criando um objeto na memória compartilhada dentro de uma lib compartilhada (então) em c ++
-
07-07-2019 - |
Pergunta
É possível compartilhar um único exemplo de 'Deus' entre todos que se vincula a esse código, a serem colocados em um objeto compartilhado?
god* _god = NULL;
extern "C"
{
int set_log_level(int level)
{
if(_god == NULL) return -1;
_stb->log_level(level);
return 0;
}
int god_init(){
if(_god == NULL){
_god = new god(); //Magic happens here
}
}
}
Desde que eu realize uma sincronização de bloqueio no início de todas as funções, e considerando que Deus em si pode novo/malloc Outras coisas, mas essas coisas nunca serão devolvidas ao chamador (deus mallocs apenas para uso interno), qual é o mais simples maneira de fazer isso, se possível.
Como isso pode ser estendido a um número arbitrário de programas vinculados a esta biblioteca compartilhada?
Solução
Boost Interprocess A biblioteca possui altos objetos de memória compartilhados portáteis (ER).
Outras dicas
Esta não é a abordagem correta. Ao fazer o que você sugere, a variável, sim, é global para a biblioteca e, portanto, o programa, mas os dados são privados para o processo de execução real. Você não poderá compartilhar os valores nos programas em execução. O @Grieve está se referindo a um global acessado por vários threads, mas os threads compartilham a mesma instância do processo pai.
Nos processos reais, você precisa chegar a um recurso de memória compartilhada específico do sistema operacional. Dar uma olhada em Memoria compartilhada para detalhes. É uma questão factível, mas não é particularmente trivial para serem realizado. Você também precisará de um sistema de sincronização de interprocesso, como semáforos, para coordenar o uso.
Eu tenho sentimento que Deus Será um servidor de algum tipo. Considere o uso de uma arquitetura de cliente/servidor adequada, para manter Deus longe das massas.