Como você percebeu, ao compartilhar a memória entre processos, não há previsão para anunciar / consumir o recurso. Portanto, além de configurar a região de endereços compartilhados, você provavelmente precisará configurar algum tipo de infraestrutura de negociação fora de banda.
A escolha óbvia é criar um Win32 compartilhado / nomeado mutex ao lado também, com a finalidade de coordenar as coisas. O processo issuer pode criar o objeto de sincronização e, em seguida, esperá-lo eficientemente (ou seja, sem girar, pois é um Kernel32
primitivo) até que o processo chamador se conecte e libere o servidor .
Isso serve como uma notificação "push" (para o servidor) para fazer as coisas acontecerem; normalmente, isso seria apenas para fins de inicialização, durante o qual o emparelhamento cliente / servidor estabelece uma conexão privada (não publicada), se necessário, para durar a vida útil de sua sessão. Se a largura de banda esperada do projeto for de um certo tipo, eles podem até estabelecer um link assíncrono livre de bloqueio por CMPXCHG
-ing na memória compartilhada, mas qualquer mecanismo de sinalização funcionará, incluindo cada um fornecendo um mutex para o uso um do outro. / p>
Assim, enquanto os pipes nomeados têm os procedimentos de configuração / desmontagem classificados como "internos", com a memória compartilhada, a desvantagem é que você é o seu próprio. Mas você certamente tem tudo o que precisa para despachar seu próprio recurso, e a vantagem é que você compartilha pedaços de memória de um lado para o outro, em vez de ter que descobrir como serializar tudo em um canal.
Na prática, você provavelmente não precisará criar a memória compartilhada até que um cliente chame, ponto no qual o cliente ou o servidor mapeariam um novo intervalo de memória compartilhada para uso particular entre eles. Seu objetivo aqui é evitar o uso de pipes nomeados, e descobrir como comunicar a quantidade (reconhecidamente mínima) de informações de configuração - ou seja, o endereço de memória do qword desse bloco, pelo menos. ser deixado como um exercício para o leitor. É um enigma bootstrapping (ou frango / ovo problema, se você preferir).