Situatie
We zijn bezig met een online spel met een persistente wereld, en waar heel veel users tegelijk samen met elkaar kunnen spelen. Nou is er aan de serverkant behoorlijk wat data, en aangezien het multithreaded is moet het zaakje wel thread-safe zijn. Hierbij moet je denken aan zo'n 10.000 (ruwe schatting) objecten waar read-locks en write-locks op gedaan kunnen worden.
Op een object kunnen door meerdere threads read-locks gedaan worden zonder dat ze in de wachtrij komen te staan (data lezen is immers niet aanpassen, dus is er ook geen gevaar). Er mag echter maar 1 write-lock op een object gedaan zijn, en als er een write-lock is mag er niet gelezen worden. Ook mag er natuurlijk geen write-lock worden gedaan als er threads al aan het lezen zijn
Probleem
10.000 is behoorlijk wat, en 10.000 Mutexen aanmaken zal Windows niet echt fijn vinden. Een CRITICAL_SECTION zou iig beter zijn... Maar hoe pak ik het beste aan dat een read-lock niet op een read-lock wacht, maar wel op een write-lock, en een write-lock altijd wacht op elk soort lock? Wat voor synchronisatie-object kan ik hiervoor gebruiken?
Hmmm nu ik dit schrijf bedenk ik me iets... ik kan natuurlijk ook gewoon alle game-logic af laten handelen door 1 thread, en de communicatiethreads queue'en gewoon de commando's die binnenkomen van de users. Dan hoef ik niet eens gebruik te maken van mutual exclusion, aangezien er altijd maar 1 thread is die ermee bezig is. Maar goed, die optie laat ik even open, misschien komen hier nog wat leuke ideetjes voorbij
We zijn bezig met een online spel met een persistente wereld, en waar heel veel users tegelijk samen met elkaar kunnen spelen. Nou is er aan de serverkant behoorlijk wat data, en aangezien het multithreaded is moet het zaakje wel thread-safe zijn. Hierbij moet je denken aan zo'n 10.000 (ruwe schatting) objecten waar read-locks en write-locks op gedaan kunnen worden.
Op een object kunnen door meerdere threads read-locks gedaan worden zonder dat ze in de wachtrij komen te staan (data lezen is immers niet aanpassen, dus is er ook geen gevaar). Er mag echter maar 1 write-lock op een object gedaan zijn, en als er een write-lock is mag er niet gelezen worden. Ook mag er natuurlijk geen write-lock worden gedaan als er threads al aan het lezen zijn
Probleem
10.000 is behoorlijk wat, en 10.000 Mutexen aanmaken zal Windows niet echt fijn vinden. Een CRITICAL_SECTION zou iig beter zijn... Maar hoe pak ik het beste aan dat een read-lock niet op een read-lock wacht, maar wel op een write-lock, en een write-lock altijd wacht op elk soort lock? Wat voor synchronisatie-object kan ik hiervoor gebruiken?
Hmmm nu ik dit schrijf bedenk ik me iets... ik kan natuurlijk ook gewoon alle game-logic af laten handelen door 1 thread, en de communicatiethreads queue'en gewoon de commando's die binnenkomen van de users. Dan hoef ik niet eens gebruik te maken van mutual exclusion, aangezien er altijd maar 1 thread is die ermee bezig is. Maar goed, die optie laat ik even open, misschien komen hier nog wat leuke ideetjes voorbij
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.