El motor C ++ en el que estoy trabajando actualmente se divide en varios subprocesos grandes: Generación (para crear mi contenido de procedimiento), Juego (para IA, scripts, simulación), Física y Renderizado.
Los hilos se comunican entre sí a través de pequeños objetos de mensaje, que pasan de hilo a hilo. Antes de dar un paso, un hilo procesa todos sus mensajes entrantes: actualizaciones para transformaciones, agregar y quitar objetos, etc.
Al principio del proceso y he notado un par de cosas:
El sistema de mensajería es engorroso. Crear un nuevo tipo de mensaje significa subclasificar la clase de mensaje base, crear una nueva enumeración para su tipo y escribir lógica sobre cómo los hilos deberían interpretar el nuevo tipo de mensaje. Es un obstáculo para el desarrollo y es propenso a errores tipográficos. (Nota: ¡trabajar en esto me hace apreciar lo geniales que pueden ser los lenguajes dinámicos!)
¿Hay una mejor manera de hacer esto? ¿Debo usar algo como boost :: bind para hacer esto automático? Me preocupa que si hago eso pierdo la capacidad de decir, ordenar los mensajes según el tipo, o algo así. No estoy seguro si ese tipo de gestión será incluso necesaria.
El primer punto es importante porque estos hilos comunican mucho. Crear y pasar mensajes es una gran parte de hacer que las cosas sucedan. Me gustaría simplificar ese sistema, pero también estar abierto a otros paradigmas que podrían ser tan útiles. ¿Hay diferentes diseños multiproceso en los que debería pensar para ayudar a que esto sea más fácil?
Por ejemplo, hay algunos recursos que se escriben con poca frecuencia, pero que se leen con frecuencia desde varios subprocesos. ¿Debería estar abierto a la idea de tener datos compartidos, protegidos por mutexes, a los que pueden acceder todos los hilos?
Esta es mi primera vez diseñando algo con multihilo en mente desde cero. En esta etapa inicial, realmente creo que está yendo realmente bien (considerando), pero me preocupa la escala y mi propia eficiencia para implementar cosas nuevas.