Hallo,
ich wollte gerne etwas für ein Projekt wissen. Normalerweise schreibe ich server derzeit mit dem Konzept each Client = 1 Thread. (boost)
Allerdings würde mich mal interessieren wen mehr als 2000 Threads am laufen sind sind, ist doch der Stack mit 1 GB voll, außer ich reduziere die Stacksize der Threads, was ich jedoch sehr ungerne mache. Wie schreibe ich denn eigentlich so ein Singlethread server ?
1 Thread Accept TCP (Befehle)
1 Thread Accept UDP (Gamedata)
1 Thread Receive Tcp ( alle clients, die der server anhand des sockets einer vorhandenen Klasse zuweist und danach das Packet clientspezifisch abarbeitet )
1 Thread Receive Udp( alle clients )
Du solltest vielleicht über das Thread Pool System nachdenken:
Quote:
So, most real-world servers use a thread-pool approach, shown to the right. In the thread-pool approach, the main thread creates a fixed number of worker threads. The main thread is still responsible for accepting connections. As it does so, it creates request objects and places them into a data structure such as a linked list or an array. Each worker threads pulls requests out of the buffer according to some scheduling algorithm, and then produces the necessary response. Thus, the main thread can accept connections as long as memory is available, while a fixed number of threads churn away at maximum efficiency.
Du solltest wie die anderen 2 schon sagten (mehr oder weniger), boost.asio verwenden.
Damit brauchst du bei weitem nicht so viele Threads, da nicht jede Connection ihren eigenen Thread bekommt sondern wie im Bild über mir einem Workerthread was zu tun gibt, das der dann abwickelt. Schau dir am besten die aktuellsten boost.asio-Beispiele an, vor allem im Zusammenhang mit C++11-Lambdas lässt sich damit wunderbar und mit relativ wenigen Zeilen Code performant und sicher arbeiten
Außerdem ist dein größtes Problem bei 2000 Threads sicher nicht der Speicherplatz, der für die Threadstacks draufgeht, sondern die schlichte Anzahl an Daten, die jeder Thread für sich auf dem Heap erzeugt und verwaltet
Danke schonmal an alle, aber ich nutze bereits boost asio.
Allerdings lasse ich nach dem der Acceptor das Callback aufgerufen hat ein Thread für eine Client Klasse starten. Aber ich finde derzeit auch nur boost prinzipien mit dem selben beispiel. Hätte mal wer ein Beispiel welches die obrig genante Struktur verwendet ?
Ich empfehle dir, deinen Server so aufzubauen:
Die dort benutzte Klasse 'session' entspricht im Großen und Ganzen einem deiner Clients, das ist laut meinem Wissen (ich lasse mich hier gerne korrigieren) eine der effizientesten und praktischten Arten, wie sich so etwas umsetzen lässt.
Die Struktur von oben funktioniert hier leider nicht so 1:1, da du ja die Verbindung offen halten möchtest und nicht für jeden Request eine neue aufmachen willst
Eigentlich sollte aber der Ansatz aus dem Beispiel als Grundidee genau das erreiche, was du haben möchtest.
Danke, außer das ich die lamda functions mit callbacks austausche, da ich nicht wirklich gerne solche funktionen nutze.
Aber bei async_read_some, wird da nicht das thread suspendet bis ein packet kommt oder handelt der ioservice das selbst mit 1 thread?
Wie, du nutzt nicht gerne "solche Funktionen"? Solange dein Compiler C++11 mit Lambdas unterstützt, solltest du sie auch verwenden - dein Code wird wesentlich kürzer, klarer und schöner lesbar (und deine Klasse ist nicht voll mit Funktionen, die sich um Verbindungen kümmern)
Nichts wird suspended bis ein Packet kommt, siehe die Referenz dazu:
Alle async_*-Funktionen returnen immer sofort, darum heißen die ja auch "async"
Wie, du nutzt nicht gerne "solche Funktionen"? Solange dein Compiler C++11 mit Lambdas unterstützt, solltest du sie auch verwenden - dein Code wird wesentlich kürzer, klarer und schöner lesbar (und deine Klasse ist nicht voll mit Funktionen, die sich um Verbindungen kümmern)
Nichts wird suspended bis ein Packet kommt, siehe die Referenz dazu:
Alle async_*-Funktionen returnen immer sofort, darum heißen die ja auch "async"
Padmak
Danke hasi !"_! , mag aber trotzdem lieber callbacks @_@ <3 #nohomo
O_o, was auch immer.
Im Endeffekt ist es deine Sache, trotzdem finde ich es komisch wenn du dich gegen Sachen wehrst, die deinen Code besser machen würden
Aber wenn du nicht möchtest, funktionieren wird es so auch
Koopa's Discount-Offer:Ectos 13,99€/stack! Lpicks 3,99/stack! 04/04/2012 - Guild Wars Trading - 0 Replies Hey ;)
My special offer until monday or sold-out. Enjoy :)
Ectos in stock:
10 Stacks http://gwah.onlinewelten.com/images/Ektoplasmakuge l.png
8 stacks sold
1 Stack = 13,99€
Koopas Special -> Ektos für 15/€ Stack -- Dietriche 4,99€/Stack 04/03/2012 - Guild Wars Trading - 1 Replies Servus ;)
Ich biete euch hier die einmalige Gelegenheit, Ektos und Dietriche zu einem sehr günstigen Preis zu kaufen.
Ektos auf Lager:
15 Stacks http://gwah.onlinewelten.com/images/Ektoplasmakuge l.png
1 Stack = 15,00€