2017-10-12 2 views
0

Mein Programm hat eine Reihe von Threads, die Hauptschleife hat keine Funktion. Ich habe die Hauptschleife als while (1) {sleep (1);} programmiert.Linux Threading, Schlaf in Haupt

Ich frage mich jetzt aber kann nicht sicher sagen, ob leistungsmäßig eine leere Hauptschleife (während (1) {}) besser ist als Schlaf (1) oder umgekehrt, oder das gleiche ???

dachte ich die Planer prüfen alle Aufgaben in jedem Planungszyklus, um zu sehen, ob sie aufgeweckt werden müssen, das tut:

  • wenn Haupt eine leer while-Schleife: wake nichts

  • zu tun up
  • , wenn der Haupt ist ein schlafender Schleife: die Aufwachzeit Stempel geprüft/neu berechnet, wenn Bedarf geweckt werden, dann nichts

jede verschie Stellen zu tun aufwachen Zensuren?

+0

Ich würde 'pause()' anstelle von 'sleep (1)' verwenden. Es ist wie 'sleep()', aber mit einer unendlichen Zeitüberschreitung. Es wird weniger häufig aktiviert (nur bei Signalen) und verbraucht weniger Ressourcen. – rodrigo

Antwort

2

gibt es viel Unterschied. Schlaf (1) Version ist viel besser als leer während (1) {}.

sleep (1) Lassen Systemkern überprüfen Zeit, wenn der Zeitalarm erreichen, wird es nächsten Schritt ausführen. Es kostet also nur eine kleine Ressource.

aber die while (1) {} ist anders, es wird die Anweisung "while (1)" die ganze Zeit, es kostet eine Menge CPU-Ressource (alle Ressourcen, die es bekommen kann).

Sie top Befehl verwenden, können die Ressourcennutzung zu überprüfen, werden Sie schlafen (1) Version Verwendung nur wenig Ressourcen, während "while (1) {}" verwenden 100% CPU (eines CPU-Kern/Thread)

finden
1

Wenn Sie Threading verwenden, wäre die beste Option wahrscheinlich, keine Schleife im Hauptthread zu haben, sondern die Operation join, die darauf wartet, dass die anderen Threads beendet werden.

0

Ich lag falsch mit der leeren While-Schleife, die alle verbleibenden CPU kostet als peter__barnes erwähnt. Mein echtes Programm hatte dies in main(): while (someCondition) {// leere Schleife}. Und das someCondition() hatte ein Signal im Inneren. Ich habe gerade darüber nachgedacht, eine leere Schleife in main() mit den anderen Programmen zu vergleichen, in denen ich (1) {sleep (1);} in main() hatte. Aber es war keine leere Schleife für den Anfang. Meine Frage war also falsch, aber es hat sich für mich Dinge geöffnet, die ich vorher nicht kannte, und die folgende Frage:

Falls mein Programm ein Daemon ist, der niemals beendet wird, ist pause() oder join() in main() besser?