Fragen zum richtigen Umgang mit Threads



  • Das sind die C-Runtime-Library-Funktionen, also alles, was der C-Standard umfaßt.



  • Das heist also, wenn ich im meinem Thread strcpy, sprintf oder dergleichen verwende sollte ich den Threat mit "_beginthread(ex)", wenn ja nach welche Kriterein benutze ich dann um "_beginthread" oder aber "_beginthreadex" zum Starten zu verwenden?


  • Mod

    • Holgi * schrieb:

    Das heist also, wenn ich im meinem Thread strcpy, sprintf oder dergleichen verwende sollte ich den Threat mit "_beginthread(ex)",

    Ja!

    wenn ja nach welche Kriterein benutze ich dann um "_beginthread" oder aber "_beginthreadex" zum Starten zu verwenden?

    Ich verstehe Deine Frage nicht. Die Frage ist was Du benötigst. _beginthreadex benötigst Du z.B. um einen Thread suspended zu erzeugen...



  • wenn sich ein Thread mal verabschiedet

    musst du deinen code halt doppelt und 3 fach absicher so mit try catch usw. ansonsten fällt mir da adhoc nur noch ein das du regelmäig einer variable einen zeitwert übergibst, den du auf 0 setzt wenn der thread beendet ... ansonsten möglichst regelmäßig updaten und den thread abschiessen wenn er 5 sek nicht reagiert .... dabei musst du aber beachten das z.B. das connect nicht zu lange dauert (non blocking mode benutzen kann da abhilfe schaffen)



  • Übrigens erhält jeder erzeugte Thread einen Stack.
    Die Grösse kann bei CreateThread (und auch bei beginthread..) angegeben werden.
    Wird 0 angegeben (wie bei Dir) wird der Stack auf 1MB festgelegt.

    Das sind bei 200 Threads alleine wegen den Thread Stacks schon 200MB die reserviert sind.

    Ich halte soviele Threads nicht für sinnvoll (nur schon wegen den Context Switches und dem Memory Verbrauch).

    Für IO gibt es mehrere Lösungen, wie man mit deutlich weniger Threads auskommt (Overlapped IO, APC, IO Completion Ports).

    Grüsse
    Simon



  • Ja, da hast du bestimmt Recht. Ich werde nachdem ich dieses Problem hier gelöst habe, versuchen alternative einen anderen Weg einschlagen und damit den Serverscan zu realisieren. Leider bin ich auf den Gebieten wie du sie anspricht überhaut nicht bewandert und so werde ich wohl noch einige Zeit brauchen bis ich mich einigermassen in der Materien auskenne. Also danke erstmal für die Antworten und Denkanstösse.



  • Speicherverbrauch ist normal kein Problem bei 200 Threads, und Context-Switches tun auch nicht wirklich soviel teurer als Dispatching über IO Completion Ports o.Ä.

    Bei 1000-10.000 Connections sieht die Sache allerdings schonwieder ganz anders aus - das bekommt man mit Threads (1 Thread pro Connection meine ich) kaum noch irgendwie hin.



  • stichwort select(...) und dann die ankommenden daten nacheinander verarbeiten (evtl. ne datenstruktur in einer map<SOCKET,MyServerData> speichern) brauch nur einen thread ... blöd natürlich wenn du 10000 sockets hast und die zeitkritisch reagieren sollen ...



  • So und jetzt hab ich doch noch eine Frage, und zwar mein Controll thread der die anderen threads kontrolliert, ob sie noch laufen, ob die maximalzahl gestarted ist, etc. Wie kann ich es anstellen das dieser Thread eine höhere Priorität oder mehr cpu Zeit wie immer man dazu sagt. Also ich weiss noch nicht ob ich das überhaupt benötige, aber zu wissen was geht und was nicht wäre schon mal hilfreich.



  • Bissi MSDN Lesen schadet nicht:

    // in dem Thread der die höhere Priorität bekommen soll:
    ::SetThreadPriority(::GetCurrentThread(), THREAD_PRIORITY_ABOVE_NORMAL);
    

Anmelden zum Antworten