2010-05-18 21 views
14

Für mich ist die ideale Anzahl von Threads 3: eins für die Benutzeroberfläche, eins für CPU-Ressourcen und eins für IO-Ressourcen.Wann sollte ich Threads verwenden?

Aber ich bin wahrscheinlich falsch.

Ich werde nur mit ihnen eingeführt, aber ich habe immer einen für die Benutzeroberfläche und einen für alles andere verwendet.

Wann sollte ich Threads verwenden und wie? Woher weiß ich, ob ich sie benutzen soll?

+3

Es wird tiefer gehende Antworten als meine geben, aber in Bezug auf die Benutzeroberfläche kann der Einsatz mehrerer Threads unter den richtigen Umständen dem Benutzer eine höhere Reaktionszeit geben, obwohl der Durchsatz geringer ist - zum Beispiel das Laden von Tabs in einem Web Browser, 1 Thread pro Tab. Es ist natürlich von Fall zu Fall. – Phil

Antwort

13

Leider gibt es keine festen Regeln für die Verwendung von Threads. Wenn Sie zu viele Threads haben, wird der Prozessor die ganze Zeit damit verbringen, zwischen ihnen zu generieren und zwischen ihnen zu wechseln. Wenn Sie zu wenige Threads verwenden, erhalten Sie in Ihrer Anwendung nicht den gewünschten Durchsatz. Außerdem ist das Verwenden von Threads nicht einfach. Eine Sprache wie C# erleichtert es Ihnen, weil Sie Werkzeuge wie ThreadPool.QueueUserWorkItem haben. Dies ermöglicht dem System, Thread-Erstellung und -Zerstörung zu verwalten. Dies trägt dazu bei, den Aufwand beim Erstellen eines neuen Threads zu verringern, um die Arbeit weiterzugeben. Sie müssen daran denken, dass die Erstellung eines Threads keine Operation ist, die Sie für "kostenlos" erhalten. Mit dem Starten eines Threads sind Kosten verbunden, die immer berücksichtigt werden sollten.

Abhängig von der Sprache, die Sie zum Schreiben Ihrer Anwendung verwenden, geben Sie vor, wie viel Sie sich über die Verwendung von Threads Gedanken machen müssen.

Die Zeiten, die ich am häufigsten zu finden, dass ich Threads berücksichtigen müssen die Schaffung explizit sind:

  • Asynchrone Operationen
  • Operationen, die
5

Von der SQLite FAQ: "Threads are evil. Vermeiden Sie." Verwenden Sie sie nur, wenn Sie unbedingt müssen.

Wenn Sie müssen, dann ergreifen Sie Maßnahmen, um das übliche Gemetzel zu vermeiden. Verwenden Sie Thread-Pools, um feinkörnige Aufgaben ohne Abhängigkeiten auszuführen, indem Sie vom GUI-Framework bereitgestellte Einrichtungen verwenden, um Ergebnisse zurück an die Benutzeroberfläche zu senden. Vermeiden Sie die gemeinsame Nutzung von Daten zwischen lang laufenden Threads. Verwenden Sie Nachrichtenwarteschlangen, um Informationen zwischen ihnen zu übertragen (und zu synchronisieren). Eine exotische Lösung ist die Verwendung von Sprachen wie Erlang, die explizit für feinkörnige Parallelität entwickelt wurden, ohne dass Sicherheit und Verständlichkeit darunter leiden. Die Nebenläufigkeit selbst ist für die Zukunft der Berechnung von grundlegender Bedeutung; Fäden sind einfach eine schreckliche, kaputte Art, sie auszudrücken.

+8

sei nicht dogmatisch. Threads sind nicht von allein böse. Es ist ein tolles Muster, um UI- und Hintergrundaktivitäts-Threads zu trennen, es bietet eine bessere Benutzererfahrung. – Andrey

+2

+1: Wenn du davon kommst, keine Threads zu verwenden, dann tu das - es wird das Testen und Debuggen sicherlich viel einfacher machen und wahrscheinlich langfristig zu einem stabileren Produkt führen. Wenn Sie Threads verwenden müssen, tun Sie es mit Bedacht. –

+2

@Andrey, die klügsten Leute, die ich kenne, sind am wenigsten zuversichtlich, Threads in ihrem Code zu verwenden. Folgen Sie dem PDF-Link, den ich zur Verfügung gestellt habe. –

9

Die Antwort hängt völlig davon ab, was Sie vorhaben zu tun. Eine für CPU-Ressourcen ist jedoch eine schlechte Bewegung - Ihre CPU kann in einer Einzelhandels-CPU bis zu sechs Kerne plus Hyperthreading haben, und die meisten CPUs haben zwei oder mehr. In diesem Fall sollten Sie so viele Threads wie CPU-Kerne haben plus ein paar mehr für die Planung von Pannen. Die gesamte CPU ist kein single-threaded Biest, sie kann viele Kerne haben und benötigt viele Threads für 100% Auslastung.

Sie sollten Threads verwenden, wenn und nur wenn Ihre Zielgruppe praktisch alle Multi-Core (wie in aktuellen Desktop/Laptop-Märkten) hat, und Sie haben festgestellt, dass ein Kern nicht genug Leistung ist.

3

Die

  • Kontinuierlicher Betrieb Hintergrundoperationen parallelisiert werden können Die "ideale Anzahl von Threads" hängt von Ihrem speziellen Problem ab und davon, wie viel Parallelität Sie ausnutzen können.Wenn Sie ein Problem haben, das "peinlich parallel" ist, da es in unabhängige Probleme unterteilt werden kann und wenig oder gar keine Kommunikation zwischen ihnen erforderlich ist und Sie genug Kerne haben, um echte Parallelität zu erreichen, dann hängt es davon ab, wie viele Threads Sie verwenden Dinge wie die Problemgröße, die Cache-Zeilengröße, der Kontextwechsel und der Launch-Overhead und verschiedene andere Dinge, die vorher schwer zu berechnen sind. Für solche Situationen müssen Sie wirklich ein Profiling durchführen, um eine optimale Partitionierung Ihres Problems über mehrere Threads hinweg zu wählen. In der Regel ist es jedoch nicht sinnvoll, mehr Threads zu verwenden als Cores. Es ist auch richtig, dass Sie, wenn Sie viel Synchronisation haben, tatsächlich eine Leistungseinbuße für die Verwendung von Threads haben. Es ist in hohem Maße abhängig von dem jeweiligen Problem sowie davon, wie voneinander abhängig die verschiedenen Schritte sind. Als Leitprinzip müssen Sie beachten, dass das Erstellen von Threads und Threadsynchronisierung kostspielige Operationen sind. Durch die parallele Ausführung von Berechnungen kann jedoch der Durchsatz erhöht werden, wenn die Kommunikation und andere Formen der Synchronisation minimal sind. Sie sollten sich darüber im Klaren sein, dass das Threading zu einer sehr schlechten Cache-Performance führen kann, wenn Ihre Threads letztendlich eine gemeinsam genutzte Cache-Zeile ungültig machen.

  • 5

    Herb Sutter schrieb an article für Dr. Dobbs Journal, in dem er über die drei Säulen der Nebenläufigkeit spricht. Dieser Artikel beschreibt sehr gut, welche Probleme mit Hilfe von Threadingkonstrukten gelöst werden können.

    Verwandte Themen