Движок C ++, над которым я сейчас работаю, разделен на несколько больших потоков: Generation (для создания моего процедурного контента), Gameplay (для AI, скриптов, симуляции), Physics и Rendering.
Потоки взаимодействуют друг с другом через небольшие объекты сообщений, которые передаются из потока в поток. Перед переходом поток обрабатывает все свои входящие сообщения - обновления для преобразования, добавления и удаления объектов и т. Д. Иногда один поток (Генерация) создает что-то (Искусство) и передает его другому потоку (Визуализация) для постоянного владения.
В начале процесса я заметил пару вещей:
Система обмена сообщениями громоздка. Создание нового типа сообщения означает создание подкласса базового класса Message, создание нового перечисления для его типа и написание логики для того, как потоки должны интерпретировать новый тип сообщения. Это скорость развития и подвержена ошибкам в стиле опечаток. (Sidenote - работая над этим, я оцениваю, какими замечательными могут быть динамические языки!)
Есть лучший способ это сделать? Должен ли я использовать что-то вроде boost :: bind, чтобы сделать это автоматически? Я беспокоюсь, что если я сделаю это, я потеряю способность говорить, сортировать сообщения по типу или что-то в этом роде. Не уверен, что такой менеджмент станет необходимым.
Первый момент важен, потому что эти темы так много общаются. Создание и передача сообщений - большая часть того, как все происходит. Я хотел бы упростить эту систему, но также быть открытым для других парадигм, которые могут быть столь же полезными. Существуют ли разные многопоточные конструкции, о которых мне следует подумать, чтобы облегчить эту задачу?
Например, есть некоторые ресурсы, которые редко пишутся, но часто читаются из нескольких потоков. Должен ли я быть открытым к идее иметь общие данные, защищенные мьютексами, к которым могут обращаться все потоки?
Это мой первый раз, когда я проектирую что-то с учетом многопоточности с нуля. На этом раннем этапе я на самом деле думаю, что все идет хорошо (учитывая), но я беспокоюсь о масштабировании и моей собственной эффективности при внедрении новых вещей.