Criando um objeto na memória compartilhada dentro de uma lib compartilhada (então) em c ++

StackOverflow https://stackoverflow.com/questions/281136

  •  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?

Foi útil?

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.

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