Performance in Threads SuspendThread/ResumeThread oder CreateThread



  • Hallo,

    Beim Programmieren einer Multithread Anwendung verwende ich für eine Berechnung zwei Threads. Diese Berechnung ist etwa alle 100ms notwendig. In einer Funktion kann ich jetzt jedes mal die beiden Threads neu erzeugen und laufen lassen, oder den Thread anhalten und erst wenn die Daten für die Berechnung wieder bereit sind neu starten. Was ist besser?

    Wie kann ich bei der Variante mit SuspendThread abfragen wann der Thread suspended ist? WaitOnSingleObject funktioniert da nicht...

    Vielen Dank

    Grüsse



  • Wilder schrieb:

    Was ist besser?

    Das ist beides Blödsinn. Benutz Events.


  • Mod



  • Vielen Dank für die Antworten. Dass mann SuspendThread nicht aufrufen sollte, habe ich jetzt begriffen. Dass ich events benutzen könnte ist mir auch klar, aber ich benötige die Rechenleistung beider Core und darum 2 Threads. Wie löse ich dann dieses Problem?
    Besten Dank

    Grüsse



  • Wie du eine Berechnung parallelisieren kannst hängt genauso von der Berechnung ab, wie die Frage "wie komme ich am schnellsten von A nach B" davon abhängt wo A und B sind, und mit was man unterwegs ist. Logisch, oder? 😉



  • Um Berechnungen auf die "passende" Anzahl an Threads aufzuteilen, rate ich zu OpenMP.



  • Die zwei Berechnungen sind unabhängig voneinander. Diese Aufteilung ist mir auch klar. Und somit ist die Frage immer noch offen, ob ich für jede Berechnung einen neuen Thread erzeugen soll, oder ob ich den Thread in ein wait schicken kann. Dazu könnte ich ja zum Beispiel einen Mutex [WaitOnSingleObject(Mutex)] verwenden. Aber welche Lösung ist da besser?
    Grüsse


  • Mod

    Beantworte Dir doch die Frage selbst:
    1. In welchem Verhältnis steht die gesamte Laufzeit zur Zeit, die das starten des Threads benötigt.
    2. In Welchem Aufwand steht es einen neuen Thread zu erzeugen und einen alten Thread (der wartet) so zu initialisieren, dass eine neue Berechnung nötig ist.

    Da wir all dies nicht wissen, kann niemand Dir Deine Frage beantworten, außer Du selbst!

    PS: Warum einen Mutex verwenden, wenn es ein Event tut!



  • Hallo,

    Vielen Dank für deine Antwort. Ok, da hast du vollkommen recht. Bei meinem Problem bin ich der Meinung, dass das Erzeugen eines neuen Threads viel länger dauert als einen Thread warten zu lassen und die Berechnung so neu zu initialisieren.
    Wenn kein Mutex und kein SuspendThread wie halte ich dann einen Thread an?

    Nochmals vielen Dank für die Hilfe

    Grüsse



  • Sorry für meine Fragerei, ich habs jetzt glaube ich begriffen.

    // Init
    _handle = CreateEvent (0, FALSE, FALSE, 0);
    
    // Set
    SetEvent (_handle)
    
    // Thread
    WaitForSingleObject (_handle, INFINITE);
    

    Ich denke das ist richtig so.

    Vielen Dank

    Grüsse



  • Ich verstehe schonmal nicht ganz wie du das Ganze bisher synchronisiert hast wenn du nicht weisst wie man Events verwendet... Also wie?



  • Ich bin in diesem Thema noch Anfänger, habs mit Mutex oder eben mit SuspendThread probiert was alles nicht so richtig funktionieren wollte. darum habe ich auch ins forum geschrieben und jetzt bin ich von der Lösung total begeistert!!!
    Grüsse


Anmelden zum Antworten