Seite 1 von 1

Server mit Threads

Verfasst: 22.12.2017 09:41
von stevie1401
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!

Re: Server mit Threads

Verfasst: 22.12.2017 10:17
von RSBasic
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:
  1. 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.
  2. 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.
  3. Thread B kann nun auf das Objekt zugreifen während Thread A und Thread C warten müssen, bis das Objekt wieder freigegeben wurde.
  4. Thread B ist mit dem Vorgang fertig und gibt das Objekt wieder frei.
  5. [...]
In der PB-Hilfe gibt es ein Beispielcode, der dir genau diese Vorgehensweise zeigt. Führe den Beispielcode aus. Du siehst, es ist alles durcheinander. Wenn du im Beispielcode das Kommentarzeichen der Zeilen ";LockMutex" und ";UnlockMutex(Mutex)" entfernst, dann werden die Threads in der richtigen Reihenfolge ausgeführt.

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

Verfasst: 22.12.2017 12:21
von STARGÅTE
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