Threading alternativen `?
-
Hallo,
ich binn aktuell dabei einen Server zu schreiben welcher meine Playerdaten handeln soll. Meine erste Idee war Threading wobei ich davon schnell wieder amkam da ich es nicht ans laufen bekomme bzw. nicht so ganz damit klar komme.Kennt einer von euch gute und brauchbare alternativen ? Es geht um Playerdaten welche dann per Bytestream übertragen werden.
Wobei ich den Bytestream auch noch nicht am laufen habe
-
Wenn du mehrere Aktionen nebeneinander (gleichzeitig) ausführen möchtest, wirst du ums Threading nicht herumkommen.
Zu nennen wären da z.B. std::thread oder boost::thread, welche auch gut dokumentiert sind, weshalb ich nicht ganz verstehe wieso du da Probleme hast.
-
Wenn du konkreter wirst, was deine Fehler angeht, kann man eventuell helfen. Zeig doch mal ein wenig Code, beschreibe, was nicht funktioniert und was du gerne hättest usw.
-
Wenn es um Netzwerk-I/O geht, nimm doch Boost.Asio und wickle alles asynchron ab.
-
BlackManta schrieb:
Hallo,
ich binn aktuell dabei einen Server zu schreiben welcher meine Playerdaten handeln soll. Meine erste Idee war Threading wobei ich davon schnell wieder amkam da ich es nicht ans laufen bekomme bzw. nicht so ganz damit klar komme.Das hört sich komisch an... Du willst Playerdaten handeln - was hat das mit Threading zu tun? Wenn bei dem Handling der Playerdaten etwas parallel geschehen soll, dann wäre Threading natürlich naheliegend, aber von parallel hast du nichts geschrieben.
Dann klingt die Begründung warum du kein Threading benutzen willst etwas seltsam. Ich versuchs mal mit ner Analogie: "Weiß jemand wie ich sonst noch von A nach B kommen kann? Ich hab mich in Muttis Auto gesetzt, bekomms aber nicht zum Laufen, ich komm damit nicht klar."
Autofahren kann man nicht einfach, man muss es lernen. Gleiches gilt für den Umgang mit Threads, mit jeder Bibliothek, mit jeder Programmiersprache. Gleich nach Alternativen zu suchen, weil du nicht auf Anhieb damit klarkommst ist eine Vermeidungshaltung, die dich nicht weit bringen wird.
-
Lol, was für ein Thread!^^
Falls du beruflich mit Programmieren zu tun hast, würde ich mir Multithreading schnellstens beibringen, sonst biste bald weg vom Fenster ("The free lunch is over"), denn Programme kann man heutzutage nur noch beschleunigen, wenn man Multithreading benutzt, da die CPU-Takte kaum noch relevant ansteigen, im Gegenteil: Sie sind meistens sogar noch weit aus geringer als noch zu Pentium 4 Zeiten.
Die einzige Alternative zu Multithreading ist Multitasking mit Prozessen, aber das kann sogar noch komplizierter werden, wenn die Prozesse untereinander kommunizieren sollen...L. G.
Steffo
-
Steffo schrieb:
wenn man Multithreading benutzt, da die CPU-Takte kaum noch relevant ansteigen, im Gegenteil: Sie sind meistens sogar noch weit aus geringer als noch zu Pentium 4 Zeiten.
Und trotzdem schaffen die modernen Proessoren auch bei niedriger Taktrate pro Kern deutlich mehr Arbeit.
In Pentium4 Zeiten haben ja auch die AMD Athlons die P4s blöd dastehen lassen, trotz ca 1 Ghz weniger Taktrate.
-
Ethon_ schrieb:
Steffo schrieb:
wenn man Multithreading benutzt, da die CPU-Takte kaum noch relevant ansteigen, im Gegenteil: Sie sind meistens sogar noch weit aus geringer als noch zu Pentium 4 Zeiten.
Und trotzdem schaffen die modernen Proessoren auch bei niedriger Taktrate pro Kern deutlich mehr Arbeit.
In Pentium4 Zeiten haben ja auch die AMD Athlons die P4s blöd dastehen lassen, trotz ca 1 Ghz weniger Taktrate.
Das mag sein, ändert aber nichts an dem beschriebenen Problem. Wenn du in ein paar Jahren mehrere hundert Cores hast und deine Applikation kann nur einen voll ausnutzen, dann schmeißt du praktisch mehrere hundert Cores weg...
Ich hab immer wieder Benchmarks gesehen, wo Applikationen auf Many-Core-Systemen schlechter abschnitten als auf Single-Core-Systemen. Das sieht man auch heute bei den Smartphones.
-
Steffo schrieb:
Das sieht man auch heute bei den Smartphones.
Prinzipiell hast du zwar recht: Multithreading ist essentiell.
Aber gerade bei Smartphones sieht man, das mehr Kerne nicht unbedingt mehr Performance bedeuten

-
Shade Of Mine schrieb:
Steffo schrieb:
Das sieht man auch heute bei den Smartphones.
Prinzipiell hast du zwar recht: Multithreading ist essentiell.
Aber gerade bei Smartphones sieht man, das mehr Kerne nicht unbedingt mehr Performance bedeuten

Ja, weil die Apps die Kerne nicht ausreizen.
-
Mal zur Info nebenbei : Ich bin gerade erst in der 11 Klasse und das dauert noch ein wenig bis ich das Beruflich machen kann

Die Sache ist ich muss die Playerdaten verarbeiten aber auch wieder welche senden.
Kurz : Client -> Server 3x pro Sekunde die Position | Server -> alle clients Position der einzelnen CLients zurück senden (Handelt sich so um 500 clients)
Dann noch Server <-> Client Login | und noch vieles mehr was eben ein MMORPG Server packen sollteDas Problem ist bzw. das Problem welches laut einem Bekannten auftreten könnte das der Server nicht alles schnell genug abarbeiten kann.
Aktuell habe ich ja eine einfach while(1) schleife und wen was kommt verarbeitet er dasHier mal mein Code ;
while(1) { FD_ZERO(&fdSet); FD_SET(acceptSocket,&fdSet); for(i=0;i<MAX_CLIENTS;i++) { if(clients[i]!=INVALID_SOCKET) { FD_SET(clients[i],&fdSet); } } rc=select(0,&fdSet,NULL,NULL,NULL); if(rc==SOCKET_ERROR) { printf("Fehler: select, fehler code: %s\n",WSAGetLastError()); return 1; } if(FD_ISSET(acceptSocket,&fdSet)) { for(i=0;i<MAX_CLIENTS;i++) { if(clients[i]==INVALID_SOCKET) { clients[i]=accept(acceptSocket,NULL,NULL); printf("Neuen Client angenommen (%d)\n",i); send(clients[i],test1,(int)strlen(test1),0); for(i=0;i<MAX_CLIENTS;i++) { if(clients[i]==INVALID_SOCKET) { continue; } if(FD_ISSET(clients[i],&fdSet)) { for(i=0;i<256;i++) { buf[i]='\0'; } rc=recv(clients[i],buf,256,0); if(rc==0 || rc==SOCKET_ERROR) { printf("Client %d hat die Verbindung geschlossen\n",i); closesocket(clients[i]); clients[i]=INVALID_SOCKET; } else { printf("Client %d hat folgendes gesandt: %s\n",i,buf); for(i=0;i<MAX_CLIENTS;i++) { if(clients[i]!=INVALID_SOCKET) { send(clients[i],buf,(int)strlen(buf),0); } } } } } break; } } } }Vllt irrt sich mein Bekannter auch und es funktioniert so
Aber wie gesagt der Server muss insgesamt ca 2000 Player handeln wobei die Karte natürlich in Regionen aufgeteilt ist dh. er muss sie nur an max 500 zurückschickenBesagter Bytestream wird heute eingebaut
-
Ist dein send asynchron?
Es wäre sicher ungünstig wenn einer deiner 2000 Clients gerade ruckelt und deswegen der Server mit ruckelt und deswegen alle anderen 1999 Clients auch mit ruckeln. Das lässt sich mit asynchronem (sprich er wartet nicht auf den Client) send realisieren und alles ist gut. 2000 Threads für 2000 Clients starten halte ich für keine gute Idee.
-
Vielleicht hab ich was für Dich. Ich habe vor kurzem eine Socketklasse geschrieben (für Windows und TCP-Sockets).
Der Server funktioniert so:
Man definiert eine Funktion mit einer vorgegebenen Signatur.
Man erstellt ein Objekt der ServerSocket-Klasse.
Man übergibt dem ServerSocket einen Zeiger auf die og. Funktion.
Man startet den Server.Der Server erstellt für jeden ankommenden Client einen Thread, in dem die og. Funktion ausgeführt wird.
Das einzige, was Deinen Anforderungen noch nicht entspricht, ist, dass die einzelnen Client - Threads keinen Zugriff auf die Liste der am Server angemeldeten Clients haben, also keine Nachrichten an die anderen Clients schicken können.
Das lässt sich aber mit ein paar Handgriffen hinzufügen.Falls Du Dir das mal ansehen willst, schick mir eine Mail, dann maile ich Dir (heute abend!) die Quellcodes.
-
Das wäre eine super Sache ! Würde mir da gerne mal anschauen
Wen die CLients nicht beim Server selber kommunizieren können ist eigentlich kein großes Problem das einzigste was ich dann eben noch ändern must ist eben die List der Clients aber das schaffe ich bestimmt irgendwie
Wie schickt man hier PNs oder Emails ? :o
-
Wie gesagt, das mit der Liste der Clients ist keine große Sache. Problematischer ist es wahrscheinlich, den ganzen Wust zu verstehen, wenn man das denn überhaupt möchte ... Naja, und für Fehlerfreiheit kann ich natürlich auch nicht garantieren.
Für eine Mail klick auf mein Benutzerprofil und dann auf Mail senden. Und vergiss nicht, eine Adresse für die Antwort anzugeben, falls das erforderlich ist (ich weiß nicht genau, wie das hier mit dem Mail-System funktioniert).