Двигун C ++, над яким я зараз працюю, розбивається на кілька великих потоків - Покоління (для створення мого процедурного вмісту), Ігровий процес (для AI, сценаріїв, моделювання), Фізика та Візуалізація.
Нитки спілкуються між собою через невеликі об’єкти повідомлень, які переходять від потоку до потоку. Перед кроком нитка обробляє всі свої вхідні повідомлення - оновлення для перетворень, додавання та видалення об'єктів тощо. Іноді один потік (Генерація) щось створить (Art) та передасть його іншому потоку (Візуалізація) для постійного володіння.
На початку процесу я помітив кілька речей:
Система обміну повідомленнями громіздка. Створення нового типу повідомлення означає підкласинг базового класу повідомлень, створення нового перерахунку для його типу та написання логіки того, як потоки повинні інтерпретувати новий тип повідомлення. Це швидкість для розвитку та схильна до помилок у стилі друку. (Sidenote - працюючи над цим, мене оцінює, наскільки великими можуть бути динамічні мови!)
Чи є кращий спосіб зробити це? Чи варто використовувати щось на зразок boost :: bind, щоб зробити це автоматичним? Я переживаю, що якщо я це зроблю, я втрачаю здатність говорити, сортувати повідомлення на основі типу чи чогось іншого. Не впевнений, чи стане таке управління навіть необхідним.
Перший момент важливий, оскільки ці нитки так сильно спілкуються. Створення та передача повідомлень є важливою частиною того, щоб все сталося. Я хотів би упорядкувати цю систему, але також бути відкритим для інших парадигм, які можуть бути так само корисними. Чи є різні багатопотокові конструкції, над якими я повинен подумати, щоб полегшити це?
Наприклад, є деякі ресурси, які нечасто написані, але часто читаються з декількох потоків. Чи повинен я бути відкритим до ідеї мати спільні дані, захищені мутексами, щоб усі потоки мали доступ?
Це мій перший раз, коли я розробляю щось із багатопоточним розумінням з самого початку. На цій ранній стадії я насправді думаю, що це йде дуже добре (враховуючи), але я переживаю за масштабування та власну ефективність щодо впровадження нових матеріалів.