Welche falschen Vorstellungen halten die Leute davon ab, Threads zu benutzen? [geschlossen]

12

Das Implementieren von Threading in einem Programm ist schwierig, aber warum werden manche Leute sie nicht implementieren, selbst wenn ein offensichtlicher Bedarf dafür besteht.

Ein Beispiel: Das Programm muss ein Dataset aus einer Datenbank laden. Die Aufgabe besteht darin, die Verbindung herzustellen und die Daten aus der Datenbank in einem Arbeitsthread abzurufen und sie dann in die GUI zu laden, wobei der GUI-Thread für den Benutzer ansprechend bleibt .

Aber nein, ich habe mit Leuten gesprochen, die zu denken scheinen, dass Fäden böse und böse sind und man sollte sie um jeden Preis vermeiden. Ich habe sogar gehört, dass ein Klassenlehrer von der Verwendung von Threads abgeraten hat und daher nicht auf deren Verwendung eingehen wollte. WAS???

Mit der Hardware, die in Multi-Core geht, denke ich, dass wir Threads besser verstehen und keine Angst haben müssen, sie zu verwenden. Ich persönlich finde es ein faszinierendes Thema.

Was haben Sie über falsches Threading gehört?

Tony der Löwe
quelle
Misfits und Underachiever können keine Threads verarbeiten. Die eigentliche Frage ist: Was werden Sie dagegen tun?
Job
3
Das sind keine falschen Vorstellungen, aber Themen sollten immer vermieden werden. Tun Sie Ihre Architektur richtig, damit die Threading-Unterstützung bereits richtig gehandhabt wurde und nicht jeder Programmierer dies selbst tun muss. Sobald Programmierer lernen, in jeder Situation einen Thread hinzuzufügen, treten große Probleme auf.
tp1
Lassen Sie mich die Frage wieder auf sich wirken lassen. Haben Sie sich gefragt, ob es alternative Ansätze zur Nutzung der Parallelverarbeitungsfunktionen gibt? Oder sind Sie einfach direkt zum Threading übergegangen, weil ein Whitepaper dies angekündigt hatte, oder weil das für bessere Programmierer cool zu sein schien? Persönlich mag ich die Idee, dass einfache Prozesse Nachrichten viel besser aneinander weiterleiten als Threads. Bin ich faul / dumm / in Eile? Ja, und wir alle in unterschiedlichem Ausmaß.
user1172763

Antworten:

19

Das Einfädeln ist schwierig

Sicher. Es kann sein. Die Leute haben jedoch die Idee im Kopf, dass es so schwer ist, dass sie sich nicht die Mühe machen , es herauszufinden.

Es ist nicht so, als ob es unmöglich wäre.

Steven Evers
quelle
2
Ich unterstütze diese Antwort. Die Leute denken, es ist schwer. Es ist jedoch nicht, wenn Sie genug Zeit damit verbringen, zu versuchen, zu verstehen.
11
@Pierre, ich würde erwarten, dass die Definition von "schwer " bei vielen Leuten lautet: "Man muss genug Zeit damit verbringen, zu versuchen, es zu verstehen".
Benjol
1
Threading wird immer einfacher mit TPL und await/ asynckeywords :)
Rachel
@Pierre 303: Wenn Sie genügend Zeit zum Verstehen aufwenden, ist es immer noch schwierig , und die Leute, die es am besten verstehen, meiden es am ehesten, so weit wie möglich.
Michael Borgwardt
9

Es ist nicht der Threading-Teil, der schwierig ist, sondern die Notwendigkeit der Synchronisation und alles andere, was mit der Verwendung von Threads einhergeht. Wie können Sie in Ihrem GUI-Beispiel dem Haupt-Thread mitteilen, dass auf das Dataset zugegriffen werden kann? Weitergeben Sie eine ganze Reihe von Rückrufen? Verteilen Sie eine ganze Reihe von Prüfvariablen in Ihrem Code? In einigen GUI-Modellen, z. B. Silverlight, gibt es eine sogenannte Thread-Affinität. Dies bedeutet, dass Sie nicht von anderen Threads aus auf GUI-Elemente zugreifen können, die sich im Haupt-Thread befinden bereit zur Weiterverarbeitung.

Ich habe wirklich nichts Falsches über Threads gehört. Ich habe gerade eine ganze Reihe von situativen Fallstudien über Synchronisation gelesen, bei denen der von Ihnen verwendete Algorithmus nicht von Natur aus parallel ist.

davidk01
quelle
Hinweis an mich: Schreiben Sie parallele Algorithmen ... danke.
Droogans
Nachrichtenwarteschlangen (wie in MFC). Es scheint jedoch gescheitert zu sein, Programmierer dazu zu bringen, die Nachrichtenwarteschlange nicht zu sabotieren (indem sie Daten direkt im Speicher freigeben), selbst wenn es sich um eine strafbare Handlung handelt.
rwong
3

Threading löst alle Ihre Probleme

Wenn Sie Leistungsprobleme haben, sollten Sie nicht direkt zum Threading springen.

Fäden sind leicht

Fäden sind in zehn und zwanzig leicht. Das Laichen von Tausenden von Threads ist nicht.

Threading ist einfach [Java]

Es ist einfach, Threads zu erstellen, das heißt aber nicht, dass Sie davon profitieren werden.

Josh K
quelle
Unter Mac OS können Sie (bei einer Standardinstallation) nicht mehr als 512 Threads erstellen.
Zneak
1
Das hängt wirklich von deiner Sprache ab. Das Laichen von 1 Million Threads in Erlang ist selbst auf einem älteren Laptop kaum zu bemerken, geschweige denn auf einem modernen Server. Dabei handelt es sich nicht nur um Threads, sondern um ausgereifte Prozesse , die viel schwerer als Threads sind. Zusätzlich zu ihrem eigenen Programmzähler und Aufrufstapel (das sind so ziemlich die einzigen Dinge, die ein Thread hat), haben sie auch einen eigenen Heap und sogar einen eigenen Garbage Collector.
Jörg W Mittag
4
@ Jörg W Mittag: Ihr Kommentar verwirrt mich. Wie ändert erlang, wie das Betriebssystem einen Thread oder Prozess erstellt?
Steven Evers
1
@ SnOrfus: Erlang verwendet keine Betriebssystem-Threads. Derzeit gibt es drei Hauptimplementierungen von Erlang: BEAM, HiPE und Erjang. BEAM und HiPE sind native Implementierungen (die sogar ohne Betriebssystem ausgeführt werden können) und implementieren ihre eigenen Prozesse. Erjang läuft auf der JVM und implementiert Prozesse mithilfe der fantastisch brillanten Kilim-Bibliothek.
Jörg W Mittag
@ Jörg W Mittag: In Anbetracht meiner Frage programmers.stackexchange.com/questions/28453/… finde ich das sehr interessant. Vielen Dank.
Steven Evers
1

Sie werden irgendwann alle Vorteile durch das Threading verlieren, da die Behebung verrückter Fehler, die durch die Verwendung einiger Bibliotheken / Funktionen entstehen, die nicht thread-sicher sind (was Sie nicht wussten), eine übermäßige Synchronisation erfordern wird.

Sie haben eine viel höhere Wahrscheinlichkeit, auf einen Fehler zu stoßen, den Sie nicht beheben können, wenn Sie Threads verwenden, wenn Sie dies nicht tun.

Kamil Szot
quelle
Nicht behebbare Fehler? Ich habe noch nie einen gesehen.
Adam 22.12.10
Sie haben wirklich noch nie einen Fehler gesehen, den Sie nicht beheben konnten? In der Zeit und für die Bezahlung, die zur Verfügung stand?
Kamil Szot
Wenn Sie noch nie auf einen nicht behebbaren Fehler gestoßen sind, sind Sie noch nicht lange genug in der Branche. Während meiner mehr als 12-jährigen Tätigkeit hat jedes Projekt, das ich mir jemals angesehen habe, mindestens einen Fehler, den niemand behoben hat, und niemand weiß, wie er behoben oder sogar reproduziert werden kann. Dies schließt Code ein, an dem ich gearbeitet habe, und Code, auf den ich Lesezugriff habe (Open Source Code). Die einzigen Teile der Software, die fehlerfrei sind, sind solche, die weniger als 2 oder 3 Seiten lang sind. Wenn Sie jedoch alle Ihre Code-Seiten 1 oder 2 lang machen, wird nichts vollständig gelöst, da Sie dann Integrationsfehler haben.
Slebetman
1

Zusammenfassend lässt sich sagen, warum Threads schwierig zu verwenden sind: -
Wahre Dinge 1) Benötigen Sie die Synchronisierung und sorgfältige Entwurfsentscheidungen darüber, was gesperrt werden soll und wann gesperrt werden soll
2) Keine Kontrolle über den Laufzeitfluss
3) Schwieriges Debuggen
4) (Sehr wenige mal) Plattformkompatibilität: - Bibliotheken existieren, um dies zu erledigen

Falsche Dinge: -
1) Verwirrende Konzepte von thread-sicheren und wiedereintretenden Funktionen
2) Threads sehen auf dem Papier gut aus, sind aber sehr schwer zu implementieren

Manoj R
quelle
Sollen diese wahr oder unwahr sein? Das OP erkundigte sich nach den Dingen, die nicht stimmen und schreckte die Leute davon ab, Multithread-Programmierung zu betreiben.
Steven Evers
Eigentlich brauchen Sie keine Sperren oder Synchronisation. Es gibt auch Message-Passing-Modelle (z. B. Erlang, Scala) und STM-Modelle (z. B. Clojure). Darüber hinaus gibt es thread-sichere Datenstrukturen, die keine Sperren benötigen (ConcurrentHashMap in Java) und atomare Grundelemente, die keine Sperren erfordern.
Kevin
1

Wenn Sie keine Tests für Ihren Code schreiben möchten, verwenden Sie keine Threads.

Themen sind nicht für den typischen "Copy and Paste" -Programmierer geeignet, der die zugrunde liegenden Grundlagen des Betriebssystems und der Computerarchitektur nicht versteht. Da 90% der Programmierer nur mit Java vertraut sind, sind dies nicht die Personen, die Threads verwenden sollten. Java macht Threads "einfach", aber ich habe viele Programmierer gesehen, die einfach dachten, wenn sie synchronisierte Strukturen verwendeten, würde ihr Code in Threads funktionieren ... ähm nein.

Davon abgesehen muss jeder irgendwo anfangen. Machen Sie einfach nicht Ihr erstes Threading-Projekt, um den Produktions-Backend-Server Ihres Unternehmens zu aktualisieren.

cmcginty
quelle
Können Sie einige Ressourcen zur korrekten Ausführung von Threads empfehlen?
Jonathan
Ich bin sicher, dass dies behoben wurde. Versuchen Sie, hier zu beginnen stackoverflow.com/questions/660621/threading-best-practices
cmcginty
Das Problem dabei ist, dass Sie selbst bei einer Testabdeckung von 100% nicht wissen können, ob Ihre Tests alle möglichen Probleme mit der Verschachtelung von Anweisungen mit freigegebenen Ressourcen abdecken. Auf der anderen Seite wird es mit einer Shared-Nothing-Architektur viel einfacher.
Zachary K
1

Ein Beispiel: Das Programm muss ein Dataset aus einer Datenbank laden. Die Aufgabe besteht darin, die Verbindung herzustellen und die Daten aus der Datenbank in einem Arbeitsthread abzurufen und sie dann in die GUI zu laden, wobei der GUI-Thread für den Benutzer ansprechend bleibt .

Ich sehe nicht, dass diese Situation aus mindestens vier Gründen die Verwendung von Threading erforderlich macht:

  1. Der Datenabruf sollte sehr schnell sein.

  2. In vielen Branchenanwendungen hat der Benutzer in den ein oder zwei Sekunden, in denen er auf das Ergebnis wartet, nichts mit der Anwendung zu tun. Außerdem muss der Benutzer warten, bis die Daten in irgendeiner Weise zurückkommen, um die gewünschte Aufgabe abzuschließen. Andererseits könnte die Abfrage intelligent codiert werden, sodass immer nur eine Seite mit Informationen abgerufen wird, und andere Optimierungstechniken könnten die Antwortzeit verkürzen.

  3. In webbasierten Schnittstellen können Links bezüglich des Threading-Modells aktiviert werden.

  4. Threading erhöht die Komplexität, wie Sie zugeben, und einige Entwickler sind möglicherweise nicht in der Lage, Features hinzuzufügen oder komplexen Code zu debuggen.

Meine Meinung ist: Verwenden Sie Threading, wenn Sie müssen, weil die Wartbarkeit und Zuverlässigkeit von Software für ein Unternehmen wertvoller ist als Code-Eleganz.

Keine Chance
quelle
1
Ihr erster Punkt erinnert mich an die Irrtümer des Distributed Computing ( en.wikipedia.org/wiki/Fallacies_of_Distributed_Computing ). Sehr viele Benutzer können wild herumklicken, wenn sie mehr als 1 oder 2 Sekunden von Ihrem Punkt 2 auf eine nicht reagierende Benutzeroberfläche warten müssen, was die Situation verschlimmert.
Sichern Sie sich den
@Secure, der Link ist interessant, danke, dass du ihn geteilt hast. Ich bin mir nicht sicher, ob wir in der heutigen Zeit jemals den Fokus des Benutzers auf die Benutzeroberfläche oder sogar auf den gesamten Job erfassen können. Ich stimme Ihnen zu, dass Sie auf E-Business-Websites nicht möchten, dass der Benutzer überhaupt abreist.
NoChance
Ich spreche nicht über den Fokus. Wenn der Benutzer auf eine Schaltfläche klickt und die Benutzeroberfläche nur einfriert, weil die Datenbank abgefragt wird, versuchen einige Benutzer, erneut auf die Schaltfläche zu klicken, ohne dass eine visuelle Reaktion darauf erfolgt. Und wieder. Versuchen Sie dann, auf andere Schaltflächen oder Optionen zu klicken. Ich habe Administratoren gesehen, die das besser wissen sollten.
Sichern Sie sich den
Noch schlimmer, wenn der Ergebnisbildschirm zum ersten Mal gezeichnet, aber leer angezeigt wird. Ich kenne die meisten aktuellen Versionen nicht, aber das Suchergebnis in älteren Outlooks ist ein gutes schlechtes Beispiel. Wenn die Suche gestartet wird, wird für einige Sekunden "Ergebnismenge ist leer" oder etwas Ähnliches mit einer großen Suchbasis angezeigt, wobei die ersten Ergebnisse angezeigt werden, wenn sie gefunden wurden. Wenn Sie zu ungeduldig sind oder es eilig haben, haben Sie bereits zum nächsten Ordner gewechselt und glauben, dass nichts da ist.
Sichern Sie sich den
1
@Secure, ich verstehe deinen Standpunkt. Was Sie hier beschreiben, zeigt ein gutes Beispiel für eine inkonsistente Benutzeroberfläche. Was Sie beschrieben haben, tritt auch bei der Suche nach Dateien auf. Aber was ist die Antwort darauf, als dem Benutzer mitzuteilen, dass die Suche bereits begonnen hat?
NoChance