O mecanismo C ++ em que estou trabalhando atualmente está dividido em vários segmentos grandes - geração (para criar meu conteúdo processual), jogabilidade (para IA, scripts, simulação), física e renderização.
Os encadeamentos se comunicam por meio de pequenos objetos de mensagem, que passam de um encadeamento para outro. Antes de pisar, um encadeamento processa todas as suas mensagens recebidas - atualizações para transformações, adição e remoção de objetos, etc. Às vezes, um encadeamento (Geração) cria algo (Art) e o passa para outro encadeamento (Rendering) para propriedade permanente.
No início do processo, notei algumas coisas:
O sistema de mensagens é complicado. Criar um novo tipo de mensagem significa subclassificar a classe Message base, criar uma nova enumeração para seu tipo e escrever uma lógica de como os encadeamentos devem interpretar o novo tipo de mensagem. É um salto de velocidade para o desenvolvimento e é propenso a erros de digitação. (Sidenote - trabalhar nisso me faz apreciar como as grandes linguagens dinâmicas podem ser!)
Existe uma maneira melhor de fazer isso? Devo usar algo como boost :: bind para tornar isso automático? Estou preocupado que, se fizer isso, perco a capacidade de dizer, classifique as mensagens com base no tipo ou algo assim. Não tenho certeza se esse tipo de gerenciamento será necessário.
O primeiro ponto é importante porque esses threads fazem muita comunicação. Criar e transmitir mensagens é uma grande parte de fazer as coisas acontecerem. Gostaria de otimizar esse sistema, mas também estar aberto a outros paradigmas que podem ser igualmente úteis. Existem projetos multithread diferentes em que devo pensar para ajudar a tornar isso mais fácil?
Por exemplo, existem alguns recursos que são escritos com pouca frequência, mas lidos frequentemente a partir de vários encadeamentos. Devo estar aberto à idéia de ter dados compartilhados, protegidos por mutexes, que todos os threads possam acessar?
Esta é minha primeira vez projetando algo com multithreading em mente desde o início. Nesse estágio inicial, acho que está indo muito bem (considerando), mas estou preocupado com o dimensionamento e com minha própria eficiência na implementação de coisas novas.