2012-07-26 12 views
5

Chcę używać wielowątkowości w moim mmorpg w C++, mam 5 wątków w tej chwili i chcę podzielić kolejny na dwa, ale mój serwer mmorpg konczy z mnóstwem wektorów, a ponieważ wektory nie mogą pisać nici, nie mogę tego zrobić poprawnie.wielowątkowość w c w mmorpg

Czy istnieje alternatywa dla używania wektorów przez wątki, czy istnieje sposób na bezpieczne przechowywanie wielowątkowego wektora do odczytu/zapisu.

Oto przykład tego, czego szukam, spróbuj znaleźć alternatywę dla czegoś takiego: Oczywiście nie jest to rzeczywisty kod, ja tylko robię przykład.

//Thread1 
//Load monster and send data to the player 
globals::monstername[myid];//Myid = 1 for now -.- 
senddata(globals::monstername[myid]);//Not the actual networking code, im just lazy. 

//Thread2 
//Create a monster and manage it 
globals::monstername.push_back("FatBlobMonster"); 
//More managing code i cant be bothered inserting >.< 

Odpowiedz

4

Nie jestem świadomy żadnej klasy wektorów bezpiecznych dla wątków. Jednakże, można tworzyć samemu, który wykorzystuje std::vector i std::mutex (w C++ 11):

template <typename T> 
class LockedVector { 

private: 
    std::mutex m; 
    std::vector<T> vec; 
}; 

zablokować mutex z std::lock.

+0

Dziękuję. Czy możesz wyjaśnić, jak z tego korzystać i jak to działa? :) –

+0

Proszę spojrzeć na: http://en.cppreference.com/w/cpp/thread/lock –

+0

To nie zadziała zbyt dobrze. Ponieważ blokujesz całą tablicę. Więc podczas gdy możesz mieć wiele wątków - wszyscy będą czekać na siebie nawzajem, aby uzyskać dostęp do wektora. Więc operacje na wektorze będą miały takie same cechy wydajności, jak gdyby były w jednym wątku. –

6

Dwie rzeczy.

  1. Nie przechowuj udostępnionych danych w jednej dużej strukturze danych, która zostanie całkowicie zablokowana. Zablokuj tylko jego części. Na przykład, jeśli musisz użyć wektorów, utwórz zestaw blokad dla regionów wektora. Załóżmy, że mam 1000 wpisów, mogę utworzyć 10 blokad, z których każdy blokuje 100 kolejnych wpisów. Ale prawdopodobnie możesz zrobić lepiej. Na przykład przechowuj swoje potwory w tabeli mieszania, gdzie każdy "pojemnik" w tabeli mieszania ma własny blokadę.

  2. Użyj blokady "odczyt/zapis". Możliwe jest stworzenie typu blokady, która umożliwia wielu czytników i jednego pisarza. W związku z tym każdy blok mieszający może mieć blokadę zapisu do odczytu. Jeśli w danym wiadrze nie są tworzone potwory, wiele wątków może odczytać potwory z tego zasobnika. Jeśli potrzebujesz mieszać nowego potwora w wiadrze, zablokuj wiadro do pisania. Ta blokada będzie czekać na zwolnienie wszystkich obecnych czytników i uniemożliwi więcej czytników do zablokowania, aż do zakończenia zapisu. Gdy nie będzie już czytników, operacja zostanie wysłana pod numer

+0

Możesz zablokować określone części wektora? Czy mówisz, że używasz wielu wektorów i blokujesz je pojedynczo? – Drise

+0

Jeśli twój wektor musi się ponownie rozdzielać, gdy rośnie, musisz zablokować cały obiekt przy zmianie rozmiaru. Ale jeśli nie nastąpi zmiana rozmiaru, a elementy mogą pozostać w tym samym punkcie przesunięcia przez czas trwania, można zablokować poszczególne części tablicy. Ale tak naprawdę nie o to chodzi. Chodzi o to, aby użyć struktury danych, która może być zablokowana w częściach. Możliwa byłaby także lista pod-tablic. –

+0

Interesujące. I tak, zrozumiałem dlaczego, po prostu nie wiedziałem, że możesz zablokować części wektorów/tablic. – Drise