Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Nox

Supermoderator

  • »Nox« ist der Autor dieses Themas

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

11

13.09.2007, 10:10

Das Problem ist ja, das nicht alle Änderungen für alle Clients interessant sind. Auch ist nicht gesagt, dass wenn ein Client eine Nachricht schickt, diese zu einer Änderung führen muss (weil z.B. die Nachricht garnicht ausgeführt werden kann).
Prinzipiell kann man für das Problem jegliche Clientreaktion ausblenden. Wir nehmen also an, dass die Clients nur stille Zuhörer sind und der Server vorsich hin werkelt. Nun muss der Server feststellen welche Daten für einen Client interessant sind und ob der Client die Daten nicht vielleicht schon hat.


(P.S: wenn ich mich recht erinnere sind Datentypen int, bool, char usw. doch atomar und die Operationen ebenfalls oder irre ich mich da?)
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

12

13.09.2007, 11:51

Zitat von »"Nox"«

(P.S: wenn ich mich recht erinnere sind Datentypen int, bool, char usw. doch atomar und die Operationen ebenfalls oder irre ich mich da?)

Was meinst du denn mit "atomar"?

Nox

Supermoderator

  • »Nox« ist der Autor dieses Themas

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

13

13.09.2007, 12:04

Stimmt, dürfte nicht das richtige Wort sein. Die Frage ist halt das Vergleichen bzw. das Setzen ein Variable von sich aus "threadsafe" ist, weil selbst einfachste Vergleichsoperationen bzw. Zuweisungsoperationen schon aus mehreren ASM-Anweisungen besteht.
Ganz konkret:

Thread 1: while(RefCounter == 2)
Thread 2: (nach einiger Zeit) RefCounter--;

Ich sehe zwar oft solche Konstrukte als eine Art Mutex, aber ich bin mir nicht sicher, ob dies wirklich sicher ist. Weil es gibt viele Weg das Risiko zu minimieren, aber das ist ein Spiel der Wahrscheinlichkeiten worauf ich mich nicht einlassen kann. Entweder es ist threadsafe oder eben nicht.
Da ich mich mit ASM nicht auskenne, wüsste ich ob das nun wirklich sicher ist oder nicht.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

14

13.09.2007, 12:33

Integer-Operationen finden normalerweise in einer einzigen Instruktion statt. Aber es müssen ja auch noch evtl. die Operanden in die Register geladen werden.
Problematisch wird es besonders, wenn mehrere Threads auf dieselbe Variable schreibend zugreifen. In deinem Beispiel schreibt der eine, und der andere liest.

Nox

Supermoderator

  • »Nox« ist der Autor dieses Themas

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

15

13.09.2007, 12:38

Okay iwenn bei bool/int gewährleistet ist, dass nur ein Thread schreibt ist also alles in Ordnung?
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

16

13.09.2007, 12:51

Es sei denn du veränderst mehrere Werte, die in irgendeinem Zusammenhang stehen. Dann kann es natürlich passieren, dass "mittendrin" gelesen werden und du inkonsistente Werte vorfindest.

Nox

Supermoderator

  • »Nox« ist der Autor dieses Themas

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

17

13.09.2007, 12:53

Ja gut das ist klar :lol: Super ein Problem weniger. Bleiben nur noch 99 ;)
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

Black-Panther

Alter Hase

Beiträge: 1 443

Wohnort: Innsbruck

  • Private Nachricht senden

18

13.09.2007, 16:42

Du könntest ja ein paar Systemnachriten einführen, mit welchen der Client dem Server mitteilen kann, welche Daten er benötigt (also die IDs der Objekte). Der Server speichert für jeden Client diese Liste von IDs und außerdem hält er ein Array mit allen existierenden IDs vom typ int[MaximaleClientAnzahl / 8 + 1]. Sobald nun ein Client upgedatet werden soll, wird bei jedem Update die ObjektID im Großen Array nachgeschlagen und das i-te Bit auf eins gesetzt (wobei i die Nummer des Clients ist!).
Falls nun ein Client plötzlich Daten braucht, die er vorher nicht brauchte oder vice versa, dann muss er lediglich eine Systemnachricht schicken, um die serverseitige ID-Liste dementsprechend zu verändern.

Overhead des ganzen sind lediglich die paar Systemnachrichten bei Clientinitialisierung und jene zur Veränderung der UpdateIDs + das Nullsetzen des großen Arrays (aber das müsste sich vermeiden lassen, wenn man das ganze geschickt angeht... hab mir das nur jetzt so schnell zusammenüberlegt! ;))
stillalive studios
Drone Swarm (32.000 Dronen gleichzeitig steuern!)
facebook, twitter

Nox

Supermoderator

  • »Nox« ist der Autor dieses Themas

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

19

13.09.2007, 17:34

Das Problem ist, rauszufinden welche Objekte ein Client braucht. Großes Array ist viel zu sehr zu starr, wofür gibt es Maps ;). Aber egal ob Map oder Array, ich müsste diese "Verwaltung" bei jedem Zugriff sperren und das kann ich nicht machen. Das Sperren kann ich mal machen aber nicht regelmäßig.

Der Client sagt z.B. ich will jetzt Sektor 3 betreten. Das System muss nun rausfinden, welche Objekte der Client jetzt braucht. Der Fall ist noch einfach, weil ich dann nur alle untergeordneten Objekte brauche. Schwieriger wird es, wenn der Client die Daten aller Objekte braucht, die ihm gehören. Dann muss der Server feststellen in welche Sektoren der Client Objekte besitzt und da wirds knuffig :badgrin: .

Atm verfolge ich die Idee, zwischen den DatenElementen und den ServerClients Verbindungselemente einzubauen. Dann muss ich nur einmal feststellen welche DatenElemente ein Client braucht und nur einmal die Clientliste Locken um sicher zu gehen, dass der Zeiger nicht ungültig wird, während die Verbindungselemente beim Client registiert werden.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

Black-Panther

Alter Hase

Beiträge: 1 443

Wohnort: Innsbruck

  • Private Nachricht senden

20

13.09.2007, 19:02

Aber das Problem mit dem Sperren könntest du mit Pipes zwischen den Threads umgehen...
stillalive studios
Drone Swarm (32.000 Dronen gleichzeitig steuern!)
facebook, twitter

Werbeanzeige