Gibt es einen Sinn für Multithreading?

7

Ich möchte das nicht subjektiv machen ...

Wenn I / O und andere Input / Output-Engpässe keine Rolle spielen, müssen wir Multithreading-Code schreiben? Theoretisch wird der Single-Thread-Code besser, da er alle CPU-Zyklen bekommt. Recht?

Wäre JavaScript oder ActionScript besser gewesen, wenn sie Multithread gewesen wären?

Ich versuche nur, den wahren Bedarf an Multithreading zu verstehen.

    
Quintin Par 05.08.2010, 14:11
quelle

11 Antworten

13

Ich weiß nicht, ob Sie in letzter Zeit (in den letzten 5 Jahren) Hardwaretrends Beachtung geschenkt haben, aber wir sind auf dem Weg zu einer Multicore-Welt.

Ein allgemeiner Weckruf war dies "Das kostenlose Mittagessen ist über " Artikel.

Auf einem Dual-Core-PC erhält eine Singlethread-Anwendung nur die Hälfte der CPU-Zyklen. Und CPUs werden nicht mehr schneller, dieser Teil von Moores Gesetz ist gestorben.

    
Henk Holterman 05.08.2010 14:15
quelle
8

In den Worten von Herb Sutter Das kostenlose Mittagessen ist vorbei , dh der zukünftige Leistungspfad für Computer wird in Bezug auf mehr Kerne nicht höhere Taktzahlen sein. Die Sache ist, dass das Hinzufügen von mehr Kernen in der Regel nicht die Leistung von Software skaliert, die nicht Multithread ist, und selbst dann hängt es vollständig von der korrekten Verwendung von Multithread-Programmiertechniken ab, daher ist Multithreading eine große Sache.

Ein weiterer offensichtlicher Grund besteht darin, eine reaktionsfähige GUI aufrechtzuerhalten, wenn z.B. Ein Klick auf eine Schaltfläche führt zu erheblichen Berechnungen oder E / A-Operationen, die eine Weile dauern können, wenn Sie auf sich selbst hinweisen.

    
S.C. Madsen 05.08.2010 14:16
quelle
7

Der Hauptgrund, warum ich heutzutage Multithreading verwende, besteht darin, die Benutzeroberfläche so ansprechend zu halten, dass das Programm zeitaufwändig ist. Sicher, es ist kein High-Tech, aber es hält die Benutzer glücklich: -)

    
Bob Moore 05.08.2010 14:20
quelle
3

Ein Großteil des Multithreading wird getan, um das Programmiermodell beim Sperren von Operationen einfacher zu machen und die Parallelität im Programm beizubehalten - manchmal bieten Sprachen / Bibliotheken / apis Ihnen nur eine kleine Auswahl oder Alternativen machen das Programmiermodell zu hart und fehleranfällig .

Abgesehen davon besteht der Hauptvorteil von Multi-Threading darin, mehrere CPUs / Kerne zu nutzen - ein Thread kann nur zu jeweils einem Prozessor / Kern laufen.

    
nos 05.08.2010 14:18
quelle
3

Die meisten CPUs sind heutzutage Multi-Core. Einfach gesagt, das heißt, sie haben mehrere Prozessoren auf dem gleichen Chip.

Wenn Sie nur einen einzelnen Thread haben, können Sie nur einen der Kerne verwenden - die anderen Kerne werden entweder inaktiv oder für andere laufende Tasks verwendet. Wenn Sie mehrere Threads haben, kann jeder auf seinem eigenen Kern laufen. Sie können Ihr Problem in X-Teile unterteilen, und wenn Sie davon ausgehen, dass jedes Teil unabhängig ausgeführt werden kann, können Sie die Berechnungen in etwa 1 / X der normalerweise benötigten Zeit abschließen.

Per Definition wird der schnellste parallel laufende Algorithmus mindestens so viel CPU-Zeit wie der schnellste sequenzielle Algorithmus verbrauchen - das heißt, die Parallelisierung verringert nicht den Arbeitsaufwand -, aber die Arbeit verteilt sich auf mehrere unabhängige Einheiten zu einer Verringerung der Echtzeit für die Lösung des Problems. Das bedeutet, dass der Benutzer nicht so lange auf die Antwort warten muss, und sie können schneller weitermachen.

Vor zehn Jahren, als Multi-Core noch nicht bekannt war, ist es wahr: Sie würden nichts gewinnen, wenn wir E / A-Verzögerungen ignorieren würden, weil es nur eine Einheit für die Ausführung gab. Das Rennen um höhere Taktraten hat jedoch aufgehört; und wir schauen stattdessen auf Multi-Core, um die verfügbare Rechenleistung zu erhöhen. Wenn Unternehmen wie Intel auf 80-Kern-CPUs schauen, wird es immer wichtiger, dass Sie sich die Parallelisierung ansehen, um die Zeit zu reduzieren, die ein Problem löst - wenn Sie nur einen einzigen Thread haben, können Sie nur diesen einen Kern und die anderen 79 verwenden Kerne werden etwas anderes tun, anstatt Ihnen zu helfen, früher fertig zu werden.

    
Michael Madsen 05.08.2010 14:27
quelle
2

Nein. Sie können nicht weiterhin die neuen CPU-Zyklen gewinnen, da sie auf einem anderen Kern existieren und der Kern, auf dem Ihre Singlethread-App existiert, wird nicht schneller. Eine Multithread-App hingegen profitiert von einem anderen Kern. Gut geschriebener paralleler Code kann bis zu 95% schneller gehen - auf einem Dual-Core, das sind alle neuen CPUs in den letzten fünf Jahren. Das ist doppelt so viel für einen Quadcore. Während Ihre Singlethread-App nicht mehr Zyklen als vor fünf Jahren erhält, hat meine Quad-threaded-App viermal so viele und übertrifft Ihre hinsichtlich Antwortzeit und Leistung deutlich.

    
Puppy 05.08.2010 14:19
quelle
1

Ihre Frage wäre gültig, hätten wir nur einzelne Kerne gehabt. Die Dinge sind jedoch, wir haben heutzutage meistens Multicore-CPUs. Wenn Sie einen Quadcore haben und ein Single-Thread-Programm schreiben, haben Sie drei Kerne, die von Ihrem Programm nicht verwendet werden.

Sie haben also maximal 25% der CPU-Zyklen und nicht 100%. Da die Technologie heute mehr Kerne und weniger Taktgeschwindigkeit hinzufügen muss, wird Threading für die Performance immer wichtiger.

    
martiert 05.08.2010 14:20
quelle
1

Das ist eine Art Frage, ob ein Schraubenzieher nötig ist, wenn ich nur diesen Nagel fahren muss. Multithreading ist ein weiteres Werkzeug in Ihrer Toolbox, das in Situationen verwendet werden kann, die davon profitieren können. Es ist nicht unbedingt in jeder Programmiersituation angemessen.

    
Larry 05.08.2010 14:21
quelle
1

Hier sind einige Antworten:

  • Sie schreiben "Wenn Input / Output-Probleme keine Engpässe sind ...". Das ist ein großes "Wenn". Viele Programme haben solche Probleme, denken daran, dass Netzwerkprobleme in "IO" enthalten sind, und in diesen Fällen lohnt sich Multithreading. Wenn Sie eine dieser seltenen Apps schreiben, die keine IO und keine Kommunikation enthält, ist Multithreading möglicherweise kein Problem
  • "Der single-threaded-Code erhält alle CPU-Zyklen". Nicht unbedingt. Ein Multi-Thread-Code könnte durchaus mehr Zyklen bekommen als eine Single-Thread-App. Heutzutage ist eine App fast immer die einzige App, die auf einem System läuft.
  • Multithreading ermöglicht es Ihnen, Multicore-Systeme zu nutzen, die heutzutage fast universell sind.
  • Multithreading ermöglicht es Ihnen, eine GUI zu halten, während eine Aktion stattfindet. Selbst wenn Sie nicht möchten, dass zwei vom Benutzer initiierte Aktionen gleichzeitig stattfinden, möchten Sie möglicherweise, dass die GUI während einer Berechnung neu gezeichnet und auf andere Ereignisse reagiert.

Kurz gesagt, ja, es gibt Anwendungen, die kein Multithreading benötigen, aber sie sind ziemlich selten und werden seltener.

    
DJClayworth 05.08.2010 14:33
quelle
1

Erstens haben moderne Prozessoren mehrere Kerne, so dass ein einzelner Thraed niemals alle CPU-Zyklen bekommt. Bei einem Dualcore-System verwendet ein einzelner Thread nur die Hälfte der CPU. Bei einer 8-Kern-CPU wird nur 1/8 verwendet.

Aus der Sicht der einfachen Leistung benötigen Sie mehrere Threads, um die CPU zu nutzen.

Darüber hinaus lassen sich einige Aufgaben auch einfacher mit Multithreading ausdrücken.

Einige Tasks sind konzeptionell unabhängig und daher ist es natürlicher, sie als separate Threads zu programmieren, die parallel laufen, als eine Einthread-Anwendung zu schreiben, die die beiden Tasks verschachtelt und bei Bedarf zwischen ihnen wechselt.

Beispielsweise möchten Sie normalerweise, dass die Benutzeroberfläche Ihrer Anwendung reaktionsschnell bleibt, selbst wenn Sie auf einen Knopf drücken, um einen CPU-lastigen Arbeitsprozess zu starten, der mehrere Minuten dauern kann. In dieser Zeit möchten Sie immer noch, dass die GUI funktioniert. Der natürliche Weg, dies auszudrücken, besteht darin, die beiden Aufgaben in separate Threads zu setzen.

    
jalf 05.08.2010 15:50
quelle
0

Die meisten Antworten hier machen die Schlussfolgerung multicore => multithreading unvermeidlich. Es gibt jedoch eine andere Möglichkeit, mehrere Prozessoren zu verwenden - multi-processing . Insbesondere unter Linux, wo AFAIK-Threads als einfache Prozesse mit einigen Einschränkungen implementiert werden und Prozesse im Gegensatz zu Windows billig sind, gibt es gute Gründe, Multithreading zu vermeiden. Daher gibt es hier Probleme mit der Softwarearchitektur, die nicht vernachlässigt werden sollten.

Natürlich, wenn die konkurrierenden Ausführungsreihenfolgen (entweder Threads oder Prozesse) mit den gemeinsamen Daten arbeiten müssen, haben Threads einen Vorteil. Aber das ist auch der Hauptgrund für Kopfschmerzen mit Fäden. Kann ein solches Programm so gestaltet werden, dass die Stücke so autonom und unabhängig wie möglich sind, so dass wir Prozesse nutzen können? Noch einmal, ein Software-Architektur-Problem.

Ich würde spekulieren, dass Multi-Threading heute das Speichermanagement in den Tagen von C ist:

  • es ist ziemlich schwer, es richtig zu machen, und ziemlich leicht zu vermasseln.
  • thread-safety-Bugs, wie Speicherlecks, sind fies und schwer zu finden

Schließlich finden Sie diesen Artikel interessant (folgen Sie diesem ersten Link auf der Seite). Ich gebe zu, dass ich nur die Zusammenfassung gelesen habe.

    
davka 08.08.2010 07:55
quelle

Tags und Links