Kann mir jemand ein Projekt vorschlagen, damit ich das Threading besser verstehe?


13

Ich bin derzeit ein C # -Entwickler mit einem ziemlich unsicheren Verständnis von Threading.

Diese beiden Links wurden in anderen Beiträgen vorgeschlagen:

http://www.yoda.arachsys.com/csharp/threads/

http://www.albahari.com/threading/

Sollte ich zurück zu den Grundlagen gehen und mir vielleicht einige Informatiktexte zu diesem Thema ansehen?

Ich habe wirklich das Gefühl, dass ich, wenn ich in die C # -Bibliotheken einspringe und sie benutze, nicht wirklich eine solide Wissensgrundlage habe, auf der ich aufbauen kann. Ich denke, ich muss dieses Thema von Grund auf lernen, wie ein Com-Sci-Student, und dann die C # -Bibliotheken verwenden.

Kann jemand einen Ansatz zum Lernen von Threading vorschlagen, vielleicht einige Links und oder Projektideen?

Danke im Voraus!

Edit, danke für alle Antworten. Einige Leute haben erwähnt, dass ein Buch eine gute Idee sein könnte, kann jemand eine vorschlagen? Ich würde etwas Sprachunabhängiges bevorzugen. Weiß jemand, in welcher Klasse dieses Zeug in einem Informatik-Abschluss behandelt werden würde? Ich versuche, online nach kostenlosen Notizen und Aufgaben zu suchen.


Ich weiß nicht, ob dies hilft, aber dies ist ein einfaches Tutorial, das ich vor einiger Zeit in VB.Net geschrieben habe und das das grundlegende Konzept des Threading erklärt. Sie sollten es ziemlich einfach in C # konvertieren können. chrishaas.wordpress.com/2009/06/25/…
Chris Haas

Ich bin stark versucht, das Schreiben einer Multithread-GUI vorzuschlagen, da dies die Grenzen dessen aufzeigen würde, was mit Threads möglich ist und was vernünftig bleibt. Aber das wäre nicht konstruktiv, also lasse ich es als Kommentar, nicht als Antwort… :-)
Donal Fellows

Antworten:


3

Schreiben Sie einen Multithread-Webserver. Sie werden eine TONNE lernen . Und nicht nur ums Einfädeln.


4

Das Producer-Consumer-Problem ist ein klassisches Beispiel und hilft Ihnen dabei, nicht nur das Threading, sondern auch die Prozessorplanung zu verstehen (dies kann mit fork () für untergeordnete Prozesse im Gegensatz zu Threads demonstriert werden) und wie Ihre Programme mit dem dahinter stehenden Betriebssystem interagieren die Szenen.

Hier ein Überblick über die wichtigen Dinge, die Sie in Bezug auf Threading / Forking verstehen sollten: 1. Wie das Betriebssystem Aufgaben plant (zum Beispiel Round-Robin-Algorithmus) 2. Ressourcensperrung (Wenn mehrere Threads dieselbe Ressource verwenden, möchten Sie dies nicht gleichzeitig auf sie zugreifen - BAD THINGS HAPPEN)

Hier ist ein Wiki-Artikel zu diesem klassischen Problem: http://en.wikipedia.org/wiki/Producer-consumer_problem

Erstellen Sie im Grunde genommen einen "Produzenten", der Threads von "Verbrauchern" erzeugt. Der Produzent produziert eine "Ressource" und die Konsumenten konsumieren sie. Stellen Sie es in eine Schleife und beobachten Sie, was passiert (Sie werden überrascht sein, dass die Verbraucher aufgrund nicht synchronisierter Methoden letztendlich mehr Ressourcen verbrauchen als verfügbar sind).


Interessanterweise habe ich dieses Muster eingerichtet, ohne es zu bemerken, während ich einen Windows-Dienst mit Threads erstellt habe. Ihre Beschreibung war perfekt. Gut zu wissen, dass dies fast als Antwort auf meine offene Frage markiert wäre.
Tony

2

Wählen Sie eines der klassischen hochparallelen Probleme. Vielleicht ist es interessanter, eine mit superlinearer Beschleunigung auszuwählen.

Überlegen Sie, ob Sie eine nicht sortierte und nicht indizierte Liste durchsuchen möchten. Dieses Problem ist trivial parallel. Implementieren Sie zuerst eine Suche mit einem Thread und dann eine naive parallele Suche. Implementiere Work-Stealing. Generieren Sie einige zufällige Datensätze und führen Sie alle drei Versionen auf denselben Datensätzen aus. Berechnen Sie die Beschleunigung.


0

Ich denke nicht, dass ein Lehrbuch der nächste beste Schritt ist. Ein Projekt ist der richtige Weg. Es sollte etwas sein, worüber Sie aufgeregt sind.

Beim ersten Threading habe ich die Leistung eines Webcrawlers verbessert. Sie können viel schneller crawlen, wenn Sie nicht alle Netzwerk-E / A-Vorgänge seriell ausführen. Dies ist zunächst ein großartiges Projekt, da Sie es auf verschiedene Arten angehen können, aber es ist bei weitem nicht so kompliziert wie beispielsweise die Multithread-GUI-Programmierung. Es erfordert auch nicht viel Fachwissen (zum Beispiel viel Rechenarbeit).

Also, finde ein paar Informationen heraus, um loszulegen und zu hacken. Es sollte nicht lange dauern, bis etwas in Gang kommt, es wird eine sanfte Einführung sein.


Ich stimme einem Projekt zu, aber Netzwerk-E / A ist kein guter Anwendungsfall für Threads. Nicht blockierende E / A sind effizienter, verbrauchen weniger Ressourcen und leiden unter weniger Race-Bedingungen und Eckfällen als dasselbe Problem, das mit Threads gelöst wurde. Ein Teil des Lernens, ein guter Parallelprogrammierer zu sein, besteht darin, zu erkennen, wenn Threads nicht ideal sind.
Ben Voigt

Vielleicht haben Sie recht, die Erfahrung, auf die ich mich bezog, war ein sehr einfaches Python-Web-Scraping, bei dem ich ungefähr 8 Codezeilen hinzugefügt habe, um es multithreadingfähig zu machen. Ich bezweifle, dass es so einfach gewesen wäre, es asynchron mit dem vorhandenen Code zu machen, aber ich würde gerne wissen, ob / wie ich falsch liege. Ich denke, ein Teil des Lernens, ein guter Parallelprogrammierer zu sein, könnte darin bestehen, eine Menge Erfahrung zu haben, sowohl gute als auch schlechte :)
Henry

0

Modellieren Sie eine einfache Spy vs. Spy-App.

Jeder Spion läuft auf einem eigenen Thread.

Jeder Spion kann dem anderen Spion Schaden zufügen, aber nicht direkt.

Jeder Spion kann dem anderen Spion wertvolle Ressourcen stehlen, aber nicht direkt.

Beide Spione verfügen über einen begrenzten Vorrat an Ressourcen und müssen diese gemeinsam nutzen. Es kann jeweils nur ein Spion eine bestimmte Ressource verwenden.


0

Aus dem Häuschen: Die 4. Ausgabe von Bruce Eckels Buch "Thinking in Java" enthält ein sehr langes Kapitel zum Thema Threading (> 100 Seiten - fast ein kleines Buch für sich). Ich habe ältere Ausgaben des Buches gelesen und dieses Kapitel nicht gelesen. Aber ich erinnere mich an einen seiner Blogposts (oder die Release Notes seines Buches), in denen er behauptet, dass das Schreiben sehr schwer war und es am Ende eine echte Leistung für ihn war. Hör zu...

Abgesehen davon gibt es diesen 2,5-stündigen Videokurs auf dieser kommerziellen Schulungsseite. Sie können jedoch eine kostenlose Testversion erhalten.

http://www.pluralsight-training.net/microsoft/olt/Course/Toc.aspx?n=clr-threading


0

Sollte ich zurück zu den Grundlagen gehen und mir vielleicht einige Informatiktexte zu diesem Thema ansehen?

Das ist immer eine gute Wahl und ich würde empfehlen, dass Sie sich ein gutes Threading-Buch zulegen, um sich mit dem Thema Threading vertraut zu machen. Ich habe Multithreading in Java gelernt und das Wissen leicht in C # übersetzt.

Wenn Sie ein praktisches Beispiel wollen, dann würde ich Ihnen empfehlen, das Problem des Essensphilosophen zu versuchen .

Sie müssen einige Dinge lernen, wenn Sie in Multithreading einsteigen:

  1. Die verschiedenen Arten der Synchronisation (Semaphor, Mutex usw.)
  2. Atomare Operationen (in C # werden Operationen, die nicht standardmäßig atomar sind, über Interlocked ausgeführt).
  3. Gleichzeitige Programmierung ohne Sperre.
  4. Wartezeitfreie gleichzeitige Programmierung.
  5. Themen, ThreadPools, BackgroundWorker usw.

Ich kann im Moment nicht an andere Dinge denken. Das Albahari-Tutorial sieht wirklich gut aus!


Leider ist das Essen von Philosophen kein nützliches Problem. Es soll eine Demonstration der Rennbedingungen sein, aber ob der Deadlock tatsächlich auftritt, hängt von den Unklarheiten des System-Schedulers, anderen Aufgaben und Hardware-Interrupts ab ... kurz, es ist völlig undeterministisch, und ich denke, es ist kein guter Ort dafür beginne zu lernen.
Ben Voigt

1
@Ben Voigt, ich würde zustimmen, dass das Problem der Essensphilosophen nicht deterministisch ist, aber ich würde sagen, dass die Mehrheit der Threading-Probleme auch nicht deterministisch ist. Als ich an einer Programmierstunde teilgenommen habe, war es eine der ersten Übungen, die wir gemacht haben. Jetzt behaupte ich nicht, dass der Lehrer unbedingt Recht hatte, aber er war mit Sicherheit einer der besten Lehrer, die ich hatte, und seine Fähigkeit zu erklären und zu unterrichten Parallelität war hervorragend. Der DPP zeigt nur eine Art von Nebenläufigkeitsproblem: Deadlocking. Das OP sollte sich auch mit den Rennbedingungen, dem ABA-Problem usw. befassen.
Kiril

@Lirik: Klar, verstehe das Problem der Essensphilosophen. Aber ich würde es nicht umsetzen. Das Schreiben von falschem Code kann zu einer schwierigen Angewohnheit werden.
Ben Voigt

@Ben Voigt, tut mir leid, ich muss etwas verpassen: Das Problem des Essensphilosophen besteht darin, ein Programm zu schreiben, das nicht blockiert. Wie würde das Lösen des DPP das Schreiben von "falschem Code" erfordern?
Kiril
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.