C# Lernmaterial Multithreading professioneller Einsatz/Verständnis

Rooky420

Cadet 4th Year
Registriert
Nov. 2015
Beiträge
98
Hallo Community,

ich suche nach einer Webseite/Dokument/Video/Tutorial in der Mulithreading von A-Z durchgearbeitet wird und und das Thema wirklich in der Tiefe behandelt wird und dies möglichst Verstäntlich auch wenn von den meisten gesagt wird "Halte dich fern von Threads die machen nur Probleme".
Die ganzen Grundlagensachen kenne ich schon und sowas wie Kapitel 15 im Galileo Openbook für C# habe ich auch schon durchgearbeitet. Ich arbeite bereits seit langer Zeit mit Threads jedoch habe ich mit ihnen öfters probleme wenn die Anwendungen eine Gewisse Größe erreich haben.

Also kurz: Ich suche eine Webseite/Dokument/Video/Tutorial in der man den professionellen Einsatz von Multithreading lernt.

In über google habe ich nichts wirklich gutes gefunden.

Habt ihr da irgendwas für mich?

Lg
 
Hallo,
das wirst du in der gewünschten tiefe und auch in der Breite auf einer Seite nicht finden. Das bietet nicht einmal die MSDN. C# bietet wirklich extrem viele Möglichkeiten ein Multithreading zu implementieren.

Ich denke es wäre am besten du schaust dir mal das "async await" Pattern mal an, und gibst dir mal die TPL (Task Process Library). Ansonsten dürfte auch der ThreadPool sowie auch die Klasse Thread von interesse sein. Beschäftigen musst du dich dann auch noch mit Synchronisierungsmechanismen wie Monitore, Mutexe usw.

Multithreading ist kein reines Programmierproblem, sondern auch ein Logisches. Da fließt recht viel zusammen. Angefangen vom Zerlegen und Aufteilen von Arbeitsaufgaben, die bereits erwähnte Synchronisierung von Threads sowie deren Implementierung selbst.

greetz
hroessler
 
Multithreading lässt sich nicht wirklich pauschal erlernen. Du kriegst aus Büchern nur die Grundlagen mit.

Letztlich hängt es dann davon ab, was du machen möchtest. Möchtest du zum Beispiel nur in verschiedenen Threads unabhängige Objekte überwachen, dann reicht dir vollkommen das Wissen über Thread.Start() und Thread.Join(). Erst, wenn Threads miteinander kommunizieren sollen oder sich untereinander synchronisieren sollen, dann wird es schwerer.


An sich sind Threads nicht so schwer. Wenn du vorher in der Konzeptphase die Aufgaben der Threads klar abgerissen hast, musst du dir nur überlegen, an welchen Stellen könnten die Threads sich gegenseitig blockieren, diese Stellen dann umgehen und schon kannst du relativ leicht Programme mit mehreren Threads programmieren :)

Ansonsten hilft es eigentlich immer, für konkrete Probleme konkrete Lösungen zu suchen. Oder einfach mal Quelltext-Schnipsel ansehen und gute Ideen mitnehmen. Da du die Grundlagen ja schon kennst, lohnt es sich fast nicht, sich nochmal ein Buch zu Gemüte zu führen.

Ansonsten eventuell ein Stückchen Lektüre, was etwas in die Tiefe geht, wenn es um Threadsynchronisation und Locks geht: Albahari Threading - Part 4. Dafür musst du aber die Grundlagen tatsächlich schon verstanden haben, da sonst die Hälfte des Artikels nur ein Kopfnicken und kein Verstehen bringt.
 
Ich hab in letzter Zeit eigentlich nur TAP (Task Asynchronous Pattern) mit bissel TPL genutzt. Es kommt ganz auf deine Aufgabenstellung an, aber das meiste kann man damit erschlagen.

Hier noch ein super Blog von Stephen Cleary zum Thema, Task, TAP, Threadpool, etc.
http://blog.stephencleary.com/
 
Multithreading ist ein sehr generischer Begriff, der von jedem Entwickler unterschiedlich interpretiert wird.
Wenn du Probleme damit hast, dann finde diese doch einfach. Kleiner Tipp: Mach nen eigenen Pool mit Prioritäten, entsprechende Implementierung kannst du dann für andere Projekte recyceln.

mfg,
Max
 
Also wenn du dir Grundlagen wirklich verstanden hast, wird es büchermäßig eigentlich nichts mehr geben, was du lernen kannst. Threads und Locks, fertig.
Was du eher dann brauchst ist eine andere Hernagehensweise an Concurrency, das Buch von Tumbleweed sieht da ganz brauchbar aus, mit Aktoren hat man da schon ein ziemlich unendlich skalierendes Stück Software komplett ohne Concurrency-Probleme. Oder du nimmst ein Buch welches die Fallstricke bei der Implementierung beleuchtet, das muss natürlich sprachgebunden sein. In Java gibt es da zB "Java Concurrency in Practice", eventuell gibt es so etwas auch für C#, oder du überträgst das Gelernte auf C#, denn es ist ziemlich allgemeingültig.
 
Threads haben nicht nur mit der Programmiersprache zu tun, sondern auch mit dem Betriebssystem, welches dem Programm einen Adressraum zuordnet. Darin enthalten sind dann der Stack, Heap, die virtuellen Mappings ins RAM usw. Threads selbst laufen dann innerhalb dieses Adressraums ab.

In Unis wird meistens dieses Buch verwendet: http://www.amazon.de/Moderne-Betrie...id=1458744882&sr=8-2&keywords=betriebssysteme

Der zweite Teil zum Verständnis ist dann die jeweilige Implentierung in der Programmiersprache selbst.

Im Prinzip muss man nur drauf achten Thread Safe Methoden zu nutzen, wenn man sich nicht weiter mit dem Betriebssystem Zeug aufhalten möchte, für alles andere muss man manuell Locks einbauen (Mutex, Semphoren, Monitore etc.). Ebenso wichtig ist das Exception handling. Zumindest für Java / C# Coder ist Betriebssystem Wissen nur ein netter Hintergrund, aber nicht wirklich nötig, da die genannten Sprachen solche Abläufe vom Programmierer verbergen und sich selbst drum kümmern.
 
Zuletzt bearbeitet:
Affe007 schrieb:
Ich hab in letzter Zeit eigentlich nur TAP (Task Asynchronous Pattern) mit bissel TPL genutzt
Mir waren zwar jetzt die Begriffe dafür nicht geläufig (Microsoft ist irgendwie ziemlich gut darin, gewöhnlichen Dingen ungewöhnliche Namen zu geben), aber ganz allgemein sind solche Thread Pool-basierten Systeme eigentlich immer gut - einfach zu handhaben, effizient (je weniger gemeinsam genutzte Daten man hat, desto besser), und gut skalieren tut es auch, wenn man ein bisschen über die Häppchen nachdenkt, die man seinem System zu tun gibt.

Rooky420 schrieb:
Ich arbeite bereits seit langer Zeit mit Threads jedoch habe ich mit ihnen öfters probleme wenn die Anwendungen eine Gewisse Größe erreich haben.
Mich würde ja mal interessieren, was das für Probleme sind bzw. waren. Auf die Nase fliegt man bei Multithreading eigentlich immer mal wieder, weil man mal wieder an irgendetwas nicht gedacht hat, aber das Potential dafür lässt sich je nach Herangehensweise eigentlich ganz gut reduzieren.

Wenn du Langeweile hast und was zum Üben brauchst, schreib eine eigene Thread Pool-Library, die
- Dependency Management bietet, also z.B. Job A erst dann ausführt, wenn B und C fertig sind, wenn A von deren Ergebnissen abhängt
- Möglichst geringen Overhead hat, um auch relativ kleine Jobs effizient parallel abzuarbeiten (wobei C# und Java dafür eigentlich die falschen Sprachen sind)
- Möglichst gut skaliert, also auch dafür sorgt, dass da nicht 32 Threads auf derselben Queue herumeiern, nur um irgendwie an Jobs zu kommen.

Ist an sich nicht wirklich schwer, man aber natürlich wissen, was man tut.
 
Zuletzt bearbeitet:
Zurück
Oben