10 Threads geschwindikeitsverlust...



  • Hallo,
    wen ich ein Programm mache das 10 Threads starten in den nur eine Schleife ist, fährt die Prozessorauslastung (1.7GHZ) auf 95% hoch obwohl in der Schleife nichts berechnet wird. Ich benutze Visual C++ 7 std... voran könnte das liegen? (keine Debugrealise sondern normal)

    mfg



  • Dafür hättest du keine 10 Threads gebraucht, da reicht auch einer;) Die Schleife durchlaufen ist eben auch ein Rechenvorgang und wenn rechenzeit übrig ist wird sie gemäß den Prioritäten verteilt. Also wenn dein Programm soviel braucht (läuft ja immer in der schleife) dann bekommt es eben auch soviel;)

    Du musst gezielt Rechenzeit von deinem Thread abgeben, indem du z.b. den Thread mit Sleep schlafen legst oder, noch besser, gezielt auf irgendein Event wartest (z.B. mit WaitForSingleObject).

    MfG
    template



  • einfach so etwas in die schleife im thread einbauen?
    HANDLE hIOMutex= CreateMutex (NULL, FALSE, NULL);
    WaitForSingleObject( hIOMutex, INFINITE );
    ...
    ReleaseMutex( hIOMutex);

    oder wie genau? im muss doch nicht jedes mal ein neues thread starten?



  • burnner schrieb:

    einfach so etwas in die schleife im thread einbauen?
    HANDLE hIOMutex= CreateMutex (NULL, FALSE, NULL);
    WaitForSingleObject( hIOMutex, INFINITE );
    ...
    ReleaseMutex( hIOMutex);

    oder wie genau? im muss doch nicht jedes mal ein neues thread starten?

    oder z.B. mittels 'Sleep(10)'.



  • Ein sleep(0) reicht auch.
    Die gibt das Zeitfenster zurück und bekommt es dann gleich wieder wenn Zeit ist.



  • @Unix-Tom
    Da hast du recht, aber das sorgt ja erstmal nur dafür das eine andere Anwendung die läuft, nicht von den wartenden Threads zu stark blockiert wird. Nichts desto trotz bekommt der Thread immer noch Rechenzeit, die verfügbar ist. Bei einem Laptop z.B. wäre es ganz schön ärgerlich wenn der akku sau schnell zur neige geht, nur weil irgendein Thread mit seiner Warteschleife zuviel last erzeugt.



  • also ich hab auch sowas ähnliches

    ich lasse auch in einer Maske, als Beispiel, ständig eine Abfrage in einer Schleife laufen, die ich aber nicht mit einem Thread sondern mit einem Timer gelöst habe. Hinter dem Timer steht erheblich viel Code und der Intervall ist auf 0 und erstaunlicherweise hab selbst ich nur eine CPU Last von max. 1%

    vielleicht bringt dir das ja was



  • das mit sleep hat was gebracht vielen dank!



  • template schrieb:

    @Unix-Tom
    Da hast du recht, aber das sorgt ja erstmal nur dafür das eine andere Anwendung die läuft, nicht von den wartenden Threads zu stark blockiert wird. Nichts desto trotz bekommt der Thread immer noch Rechenzeit, die verfügbar ist. Bei einem Laptop z.B. wäre es ganz schön ärgerlich wenn der akku sau schnell zur neige geht, nur weil irgendein Thread mit seiner Warteschleife zuviel last erzeugt.

    Wenn man das nicht will das er Rechenzeit bekommt braucht man auch keine Thread.
    Dann kann man ihn auch beenden und starten wenn man was berechnen will.
    Das Sleep(0) soll lediglich das BS checken lassen ob noch andere Programme außer die Leerlaufroutine Rechnezeit benötigen. Macht das BS sowieso aber die ist eben eine Windowseigenart das ein Thread dann alle Rechnezeit bekommt wenn sie frei ist. Ist eigentlich auch nur ein Schönheitsfehler da man keinen Geschwindigkeitsverlust verspürt. Es wird eben nur der Leerlaufroutine zeit weggenommen.

    Laptops checken den Speedstep anhand der Auslastung. Da Schalten sie aber meist erst ab 50 - 60% in die höhere Geschwindigkeit.
    Sonst braucht es nicht mehr Strom eine Schleife laufen zu lassen.

    Hat man eine Rechneroutine und man baut da Sleep(10) ein kann man sich nun ausrechnen wie viel länger der Ablauf dauert.
    Also wenn es nur um die SChönheit geht dann ein Sleep(0);



  • Was sollen deine 10 Threads eigentlich machen?

    (vielleicht finden wir noch einen besseren Akku- und Performance-Schoner)


Anmelden zum Antworten