Moin!
Ich habe mir einen Spieleserver gebastelt, der soweit gut funktioniert. Als Grundlage habe ich dafür das PB-Serverbeispiel genommen.
Das Problem ist, dass manchmal alles sehr langsam ist und die Clients nicht immer alle Daten bekommen.
Ich vermute einmal, dass es daran liegt, dass der Server alles nacheinander abarbeitet und er dabei einige Anfragen einfach nicht mitbekommt.
Nun möchte ich mir einen Server basteln der mit Threads arbeitet.
Leider verstehe ich das "LockMutex" und UnLockMutex" nicht.
Kann mir das bitte jemand in einfachen Worten (am Besten auch mit einem leicht verständlichen Beispiel) erklären?
Besten Dank!
Server mit Threads
-
- Beiträge: 659
- Registriert: 19.10.2014 15:51
- Kontaktdaten:
Server mit Threads
Ich programmiere nur noch mit Linux.
Linux Mint 21.x
Linux Mint 21.x
Re: Server mit Threads
Wenn du 3 Threads hast, dann werden alle 3 Threads gleichzeitig asynchron ausgeführt. Wenn aber die 3 Threads auf dasselbe Objekt (z.B. Variable oder String) zugreifen, dann können Probleme (Werte sind falsch oder IMA-Fehler) entstehen.
Um das zu verhindern, gibt es Mutex (Semaphore ist auch wichtig, dazu später mehr), mit dem du sicherstellen kannst, dass immer nur ein Thread von den 3 Threads gleichzeitig darauf zugreifen kann und wenn dieser Thread mit dem Vorgang fertig ist, dann kann ein anderer Thread ebenfalls darauf zugreifen während die anderen Tnreads weiterhin warten muss.
Beispiel:
Es gibt aber noch CreateSemaphore. Mit SignalSemaphore kannst du an einen anderen Thread, der auf WaitSemaphore wartet, ein Signal senden, damit der andere Thread den Vorgang fortsetzen kannst. Weitere Informationen und ein Beispielcode findest du hier: http://www.purearea.net/pb/german/manua ... phore.html
Um das zu verhindern, gibt es Mutex (Semaphore ist auch wichtig, dazu später mehr), mit dem du sicherstellen kannst, dass immer nur ein Thread von den 3 Threads gleichzeitig darauf zugreifen kann und wenn dieser Thread mit dem Vorgang fertig ist, dann kann ein anderer Thread ebenfalls darauf zugreifen während die anderen Tnreads weiterhin warten muss.
Beispiel:
- Thread A reserviert das Objekt und kann darauf zugreifen während Thread B und Thread C warten müssen, bis das Objekt wieder freigegeben wurde.
- Thread A ist mit dem Vorgang fertig und gibt das Objekt wieder frei. Thread B und Thread C können theoretisch darauf zugreifen, aber nur ein Thread bekommt die Zugriffserlaubnis. Z.B. hat Thread B die Erlaubnis bekommen.
- Thread B kann nun auf das Objekt zugreifen während Thread A und Thread C warten müssen, bis das Objekt wieder freigegeben wurde.
- Thread B ist mit dem Vorgang fertig und gibt das Objekt wieder frei.
- [...]
Es gibt aber noch CreateSemaphore. Mit SignalSemaphore kannst du an einen anderen Thread, der auf WaitSemaphore wartet, ein Signal senden, damit der andere Thread den Vorgang fortsetzen kannst. Weitere Informationen und ein Beispielcode findest du hier: http://www.purearea.net/pb/german/manua ... phore.html
Re: Server mit Threads
Der Vollständigkeitbalber möchte ich noch auf "mögliche Probleme" mit ReceiveNetworkData() eingehen:
http://www.purebasic.fr/german/viewtopi ... 57#p307857
http://www.purebasic.fr/german/viewtopi ... 91#p307891
http://www.purebasic.fr/german/viewtopi ... 57#p307857
http://www.purebasic.fr/german/viewtopi ... 91#p307891
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr