Server mit Threads

Für allgemeine Fragen zur Programmierung mit PureBasic.
stevie1401
Beiträge: 659
Registriert: 19.10.2014 15:51
Kontaktdaten:

Server mit Threads

Beitrag 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!
Ich programmiere nur noch mit Linux.
Linux Mint 21.x
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Server mit Threads

Beitrag 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
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6999
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Server mit Threads

Beitrag 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
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
Antworten