Silnik C ++, nad którym obecnie pracuję, jest podzielony na kilka dużych wątków - Generacja (do tworzenia treści proceduralnych), Rozgrywka (do sztucznej inteligencji, skryptów, symulacji), Fizyka i Rendering.
Wątki komunikują się ze sobą za pośrednictwem małych obiektów wiadomości, które przechodzą od wątku do wątku. Przed krokiem wątek przetwarza wszystkie przychodzące wiadomości - aktualizacje przekształceń, dodawanie i usuwanie obiektów itp. Czasami jeden wątek (Generacja) utworzy coś (Sztuka) i przekaże go do innego wątku (Rendering) w celu stałego posiadania.
Na początku procesu zauważyłem kilka rzeczy:
System przesyłania wiadomości jest uciążliwy. Utworzenie nowego typu wiadomości oznacza podklasę podstawowej klasy Message, utworzenie nowego wyliczenia dla tego typu i zapisanie logiki tego, jak wątki powinny interpretować nowy typ wiadomości. Jest to próg zwalniający w rozwoju i podatny na błędy w literówkach. (Sidenote - praca nad tym sprawia, że doceniam, jak świetne mogą być dynamiczne języki!)
Czy jest na to lepszy sposób? Czy powinienem użyć czegoś takiego jak boost :: bind, aby zrobić to automatycznie? Martwię się, że jeśli to zrobię, stracę możliwość powiedzenia, posortowania wiadomości według typu lub czegoś takiego. Nie jestem pewien, czy tego rodzaju zarządzanie w ogóle stanie się konieczne.
Pierwszy punkt jest ważny, ponieważ wątki te bardzo się komunikują. Tworzenie i przekazywanie wiadomości to duża część spraw, aby coś się działo. Chciałbym usprawnić ten system, ale także być otwarty na inne paradygmaty, które mogą być równie pomocne. Czy są różne projekty wielowątkowe, o których warto pomyśleć, aby ułatwić to?
Na przykład niektóre zasoby są rzadko zapisywane, ale często czytane z wielu wątków. Czy powinienem być otwarty na pomysł posiadania wspólnych danych, chronionych przez muteksy, do których dostęp mają wszystkie wątki?
To mój pierwszy projekt od podstaw z myślą o wielowątkowości. Na tym wczesnym etapie wydaje mi się, że idzie naprawdę dobrze (biorąc pod uwagę), ale martwię się skalowaniem i własną wydajnością we wdrażaniu nowych rzeczy.