Czołem,
Piszę grę, która będzie wielowątkowa: każdy NPC będzie posiadał swój wątek. Szukam optymalnego sposobu porozumiewania się między nimi. Zakładam, że każdy wątek będzie posiadał swoją kolejkę, na której będzie prowadził nasłuch, a w przypadku otrzymania wiadomości podejmie określone działanie. Zawsze będzie tak, że publikować do kolejki mogą wszyscy, nasłuch i pobieranie wiadomości z kolejki wykonuje tylko jeden wątek.
W Javie istnieje rozwiązanie desygnowane do tego: ArrayBlockingQueue, zastanawiam się, czy coś takiego istnieje również pod C++, czy taką klasę muszę sobie samodzielnie stworzyć?
Ponieważ każdy wątek będzie miał swoją kolejkę, rozsądnym jest obok tablicy wątków ustawienie również tablicy kolejek, przypisanych do tych wątków. Czy jedynym rozwiązaniem jest ustawienie takiej tablicy jako zmiennej globalnej?
I ostatnie pytanie: skoro każdy może publikować do kolejki, a kolejność napływających komunikatów jest obojętna, czy jest sens używać jakichś semaforów, czy też mogę założyć, że dodawanie elementów do kolejki jest procesem bezpiecznym? Nie wiem bowiem jednego:
- Kolejka jest zadeklarowana (załóżmy) globalnie. Znajduje się wobec tego w ogólnodostępnej przestrzeni adresowej programu.
- Każdy watek (w tym wątek główny programu) ma swoją prywatną stertę na potrzeby wykonywania własnych operacji.
- Jeśli wątek_1 wywoła kolejka.add(message1), a wątek_2 chwilę później wywoła kolejka.add(message2), to czy wywołania funkcji add znajdą się na:
- stercie wątku głównego
- stertach każdego z wątków, odpowiednio wątku_1 i wątku_2?
Z góry dziękuję za pomoc.