Pergunta

Eu pensei em usar de Boost.Interprocess Message Queue no lugar de tomadas para a comunicação dentro de um hospedeiro. Mas depois de cavar para ele, parece que esta biblioteca por algum motivo evita a instalação de fila de mensagens POSIX (que o meu sistema suporta Linux), e em vez disso é implementado em cima do POSIX memória compartilhada. A interface é bastante semelhante que você pode não acho que isso imediatamente, mas parece ser o caso.

A desvantagem para mim é que a memória compartilhada obtido via shm_open(3) não parece ser utilizável com select(2), ao contrário de POSIX filas de mensagens obtidas através mq_open(3).

Parece que a biblioteca de impulso perde neste caso. Alguém entender sei por que isso deveria ser? Mesmo que filas de mensagens POSIX só estão disponíveis em alguns sistemas, eu esperaria impulso de usar essa facilidade onde está disponível, e reimplementar-lo apenas quando necessário. Existe alguma armadilha do sistema POSIX, que eu ainda não reconhecem?

Foi útil?

Solução

Corri para uma situação semelhante no outro dia quando usando classes de sincronização Boost.Interprocess': ou seja, a classe condição. Ele é implementado de uma forma "genérica", mas do jeito que tem sido feito é usar um spinlock costume que é altamente ineficiente (no OS X, pelo menos). Para todos os efeitos, ele fez as classes de sincronização inútil.

Na minha experiência, a biblioteca Interprocess é muito imaturo. Eu usá-lo para a memória compartilhada, e ela não funciona muito bem, mas existem algumas arestas e eu tive que cortar em torno de algumas "características ausentes" como redimensionar dinamicamente a memória compartilhada etc.

Em resumo, não espere que esta biblioteca para ser uma bala de prata ainda. É bom, mas não excepcional neste momento.

Outras dicas

Sim, infelizmente, isso não acontece. Eu também fiquei decepcionado quando perceber que depois de cavar fontes.

Mas aqui está outro lado (bom) deste fato: se os seus usos programa boost::asio, você pode embrulhar POSIX filas de mensagens API como apenas mais um datagrama fonte de dados e este (IMHO) seria ainda melhor para usar se fosse uma parte de boost::interprocess ... seria bastante não trivial, mas (IMHO) definitivamente merece isso, então você pode trabalhar w / MQ de maneira unificada e uso poder de outras coisas boost::asio ...

... no meu próximo projeto, se eu precisaria POSIX MQ novamente, eu definitivamente vou tomar este caminho:)

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