Threading alternativen `?



  • 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 sollte

    Das 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 das

    Hier 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ückschicken

    Besagter 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).


Anmelden zum Antworten