![Page 1: Seminar aus Softwareentwicklung Threading unter.NET Daniel Grünberger 9855066](https://reader033.vdokument.com/reader033/viewer/2022052504/55204d8049795902118d2f6c/html5/thumbnails/1.jpg)
Seminar aus Softwareentwicklung
Threading unter .NET
Daniel Grünberger 9855066
![Page 2: Seminar aus Softwareentwicklung Threading unter.NET Daniel Grünberger 9855066](https://reader033.vdokument.com/reader033/viewer/2022052504/55204d8049795902118d2f6c/html5/thumbnails/2.jpg)
Inhalt 2
Inhalt
Geschichtlicher Hintergrund
Überblick über Threads
Synchronisation von Daten
AppDomain
Literatur
![Page 3: Seminar aus Softwareentwicklung Threading unter.NET Daniel Grünberger 9855066](https://reader033.vdokument.com/reader033/viewer/2022052504/55204d8049795902118d2f6c/html5/thumbnails/3.jpg)
Geschichtlicher Hintergrund 3
Geschichtlicher Hintergrund
Anfang der Softwareentwicklung verwendeten die meisten Programme „nur einen“ Prozess
Software-Programme wurden immer komplexer und umfangreicher– Verwendung von mehreren Prozessen
Probleme: welcher Prozess bekommt wie viel CPU-Leistung? Welcher Prozess bekommt welche Ressourcen? Viel Aufwand für Prozess-Kommunikation und nicht wirklich
effizient Lösung:
Man erschuf einen leichtgewichtigen Prozess Entstehung der Threads
![Page 4: Seminar aus Softwareentwicklung Threading unter.NET Daniel Grünberger 9855066](https://reader033.vdokument.com/reader033/viewer/2022052504/55204d8049795902118d2f6c/html5/thumbnails/4.jpg)
Überblick über Threads 4
Überblick über Threads
Was ist ein Thread?
Erstellen eines Threads
Übergabe von Daten an Threads
![Page 5: Seminar aus Softwareentwicklung Threading unter.NET Daniel Grünberger 9855066](https://reader033.vdokument.com/reader033/viewer/2022052504/55204d8049795902118d2f6c/html5/thumbnails/5.jpg)
Was ist ein Thread 5
Was ist ein Thread
Ein Thread:bezeichnet eine selbständig ausführbare
Programm-Funktion kann unabhängig vom übrigen Programm
ausgeführt werdenkann so dutzende von Teilaufgaben scheinbar
gleichzeitig ausführen
![Page 6: Seminar aus Softwareentwicklung Threading unter.NET Daniel Grünberger 9855066](https://reader033.vdokument.com/reader033/viewer/2022052504/55204d8049795902118d2f6c/html5/thumbnails/6.jpg)
Was ist ein Thread 6
Verwendung
Falls Programm mehrere Dinge gleichzeitig machen soll, setzt man Threads ein
Beispiel: Berechnung der Zahl PI (3,14159265…) bis auf die
Millionste Stelle genau Ohne Thread: Programm läuft ein paar Millionen
Jahre ohne Output Mit Thread: Programm kann jederzeit unterbrochen
werden
![Page 7: Seminar aus Softwareentwicklung Threading unter.NET Daniel Grünberger 9855066](https://reader033.vdokument.com/reader033/viewer/2022052504/55204d8049795902118d2f6c/html5/thumbnails/7.jpg)
Erstellen eines Thread 7
Erstellen eines Thread
Klassen/Funktionen für Threads sind im Namensraum System.Threading zu finden
z.B.:Start()Join()Sleep()Abort() ...
![Page 8: Seminar aus Softwareentwicklung Threading unter.NET Daniel Grünberger 9855066](https://reader033.vdokument.com/reader033/viewer/2022052504/55204d8049795902118d2f6c/html5/thumbnails/8.jpg)
Erstellen eines Thread 8
Zustandsdiagramm
![Page 9: Seminar aus Softwareentwicklung Threading unter.NET Daniel Grünberger 9855066](https://reader033.vdokument.com/reader033/viewer/2022052504/55204d8049795902118d2f6c/html5/thumbnails/9.jpg)
Erstellen eines Thread 9
Erstellen eines Thread
Beispiel: using System;using System.Threading;namespace ThreadHelloWorld{ class ThreadHelloWorldTest { static void ThreadEntry() { Console.WriteLine(“Hello Threading World”); } static void Main(string[] args) { Thread t = new Thread (new ThreadStart(ThreadEntry)); t.Name = “Hello World Thread”; t.Priority = ThreadPriority.AboveNormal; t.Start(); t.Join(); } }}
Neue Instanz + festlegen des Startpunktes
Optional: Name des Thread + Priorität
Starten des Thread + Warten bis beendet
Startpunkt: Funktion vom Typ void!
![Page 10: Seminar aus Softwareentwicklung Threading unter.NET Daniel Grünberger 9855066](https://reader033.vdokument.com/reader033/viewer/2022052504/55204d8049795902118d2f6c/html5/thumbnails/10.jpg)
Übergabe von Daten an Threads 10
Übergabe von Daten an Threads
3 Möglichkeiten Daten zu übergeben:Verwendung von globalen VariablenKapselung des „Entrypoints“ in eine eigene
KlasseVerwendung von „thread local storage“ (TLS)
![Page 11: Seminar aus Softwareentwicklung Threading unter.NET Daniel Grünberger 9855066](https://reader033.vdokument.com/reader033/viewer/2022052504/55204d8049795902118d2f6c/html5/thumbnails/11.jpg)
Übergabe von Daten an Threads 11
Verwendung von globalen Variablen
using System;using System.Threading;namespace ThreadHelloWorldStaticInformation{ class ThreadHelloWorldTest { static string message; static void ThreadEntry() { Console.WriteLine(message); } static void Main(string[] args) { message = “Hello World”; Thread t = new Thread (new ThreadStart(ThreadEntry)); t.Start(); t.Join(); } }}
Wert der globalen Variable zuweisen
Thread gibt Wert der globalen Variable aus
![Page 12: Seminar aus Softwareentwicklung Threading unter.NET Daniel Grünberger 9855066](https://reader033.vdokument.com/reader033/viewer/2022052504/55204d8049795902118d2f6c/html5/thumbnails/12.jpg)
Übergabe von Daten an Threads 12
Kapselung des „Entrypoints“ in eigene Klasse
using System;using System.Threading;namespace ThreadHelloWorld { class HelloWorld { private string message; public string Message { get{ return message;} set{ message = value;} } public void ThreadEntry() { Console.WriteLine(message); } } class DynamicThreadInformation { static void Main(string[] args) { HelloWorld first = new HelloWorld(); first.Message = “Hello World”; Thread t = new Thread (new ThreadStart(first.ThreadEntry)); t.Start(); t.Join(); } }}
Eigene Klasse: Daten werden einem Property
zugewiesen
Instanz erstellen, Daten zuweisen und Thread starten
![Page 13: Seminar aus Softwareentwicklung Threading unter.NET Daniel Grünberger 9855066](https://reader033.vdokument.com/reader033/viewer/2022052504/55204d8049795902118d2f6c/html5/thumbnails/13.jpg)
Übergabe von Daten an Threads 13
Verwendung von „thread local storage“ (TLS)
using System;using System.Threading;namespace ThreadHelloWorld{ class ThreadLocalStorage { static LocalDataStoreSlot slot; static void ThreadEntry() { Console.WriteLine(“The data in the slot is: {0}”, (string)Thread.GetData(slot)); } static void Main(string[] args) { String message = “Hello World”; slot = Thread.AllocateDataSlot(); Thread.SetData(slot,message); Thread t = new Thread (new ThreadStart(ThreadEntry)); t.Start(); t.Join(); } }}
Daten werden in TLS gestellt
Daten werden von TLS ausgelsen
![Page 14: Seminar aus Softwareentwicklung Threading unter.NET Daniel Grünberger 9855066](https://reader033.vdokument.com/reader033/viewer/2022052504/55204d8049795902118d2f6c/html5/thumbnails/14.jpg)
Synchronisation von Daten 14
Synchronisation von Daten
Relativ einfache Datenübergabe an Threads
Jedoch Problem bei Multithreading – falls mehrere Threads auf gleiche Daten / Ressourcen zugreifen wollen
![Page 15: Seminar aus Softwareentwicklung Threading unter.NET Daniel Grünberger 9855066](https://reader033.vdokument.com/reader033/viewer/2022052504/55204d8049795902118d2f6c/html5/thumbnails/15.jpg)
Synchronisation von Daten 15
Multithreading - Beispiel 1(1/2) class Worker { private int Fib(int x) { return ((x<=1)?1:(Fib(x-1)+Fib(x-2))); } public void doWork() { string item = Convert.ToString(Thread.CurrentThread.Name) + “ “; for (int i =0; i < 10; i++) { Console.WriteLine(“Thread {0} {1} {2}”, item,i,Fib(30)); } } }
Entrypoint für Thread
![Page 16: Seminar aus Softwareentwicklung Threading unter.NET Daniel Grünberger 9855066](https://reader033.vdokument.com/reader033/viewer/2022052504/55204d8049795902118d2f6c/html5/thumbnails/16.jpg)
Synchronisation von Daten 16
Multithreading - Beispiel 1(2/2)
class UnsynchronizedTest { static void Main(string[] args) { Worker wq = new Worker(); Thread a = new Thread( new ThreadStart(wq.doWork)); a.Name = “a”; Thread b = new Thread( new ThreadStart(wq.doWork)); b.Name = “b”; Thread c = new Thread( new ThreadStart(wq.doWork)); c.Name = “c”; Thread d = new Thread( new ThreadStart(wq.doWork)); d.Name = “d”; Thread e = new Thread( new ThreadStart(wq.doWork)); e.Name = “e”; a.Start(); b.Start(); c.Start(); d.Start(); e.Start(); } }
Threads werden nicht synchronisiert gestartet
![Page 17: Seminar aus Softwareentwicklung Threading unter.NET Daniel Grünberger 9855066](https://reader033.vdokument.com/reader033/viewer/2022052504/55204d8049795902118d2f6c/html5/thumbnails/17.jpg)
Synchronisation von Daten 17
Ergebnis?
Nicht Zufriedenstellend!!
![Page 18: Seminar aus Softwareentwicklung Threading unter.NET Daniel Grünberger 9855066](https://reader033.vdokument.com/reader033/viewer/2022052504/55204d8049795902118d2f6c/html5/thumbnails/18.jpg)
Synchronisation von Daten 18
Warum?
Jeder Thread versucht CPU-Leistung zu bekommen
Kein geordnetes vorgehen
Im schlimmsten Fall kann es Threads geben, die niemals CPU-Leistung bekommen
![Page 19: Seminar aus Softwareentwicklung Threading unter.NET Daniel Grünberger 9855066](https://reader033.vdokument.com/reader033/viewer/2022052504/55204d8049795902118d2f6c/html5/thumbnails/19.jpg)
Synchronisation von Daten 19
Allgemeine Synchronisationsprobleme Race-Condition:
zeitlich unkoordinierte Arbeit zweier Threads gefährden den erfolgreichen Ablauf eines Programms
Deadlock: Bei einem Deadlock warten zwei oder mehrere
Threads aufeinander, und keiner kann sich aus dieser Situation befreien
Bsp: Dining Philosphers,…
![Page 20: Seminar aus Softwareentwicklung Threading unter.NET Daniel Grünberger 9855066](https://reader033.vdokument.com/reader033/viewer/2022052504/55204d8049795902118d2f6c/html5/thumbnails/20.jpg)
© 2003 Daniel Grünberger 9855066 20
Race-Condition
public void ThreadProcA(int index){ lock(GlobalList) { GlobalList.Items.RemoveAt(index); }}public void ThreadProcB(){ For (int x =0; x < GlobalList.Items.Count; x++) { //… mehrere zeitaufwändige Operationen lock(GlobalList) { GlobalList.Items[x] = … // irgendeine Manipulation } }}
Es kann vorkommen, dass auf leere Listenelemente zugegriffen wird - FEHLER
Löschen eines Listenelements
Datenmanipulation: z.B.: Ausgabe
![Page 21: Seminar aus Softwareentwicklung Threading unter.NET Daniel Grünberger 9855066](https://reader033.vdokument.com/reader033/viewer/2022052504/55204d8049795902118d2f6c/html5/thumbnails/21.jpg)
Synchronisation von Daten 21
Deadlock
public void ThreadProcA(){ lock(RefA) { //… lock(RefB) { //… } }}public void ThreadProcB(){ lock(RefB) { //… lock(RefA) { //… } }}
Resource A wird gesperrt
Resource B wird gesperrt
Wartet vergeblich auf Ressource B
Wartet vergeblich auf Ressource A
![Page 22: Seminar aus Softwareentwicklung Threading unter.NET Daniel Grünberger 9855066](https://reader033.vdokument.com/reader033/viewer/2022052504/55204d8049795902118d2f6c/html5/thumbnails/22.jpg)
Synchronisation von Daten 22
Gegenmaßnahmen
Funktion Monitor bzw. Lock verwenden
Verhindert, dass mehrere Threads gleichzeitig auf die gleiche Ressource zugreifen
Man kann Ressourcen für Threads sperren und wieder freigeben
![Page 23: Seminar aus Softwareentwicklung Threading unter.NET Daniel Grünberger 9855066](https://reader033.vdokument.com/reader033/viewer/2022052504/55204d8049795902118d2f6c/html5/thumbnails/23.jpg)
Synchronisation von Daten 23
Funktion Monitor – Lock
Monitor.Enter(this) // kritische AusführungMonitor.Exit(this);Bzw.try{ Monitor.Enter(this); // kritische Ausführung}Finally{ Monitor.Exit(this)}
entspricht:lock(this){ //kritische Ausführung
}
![Page 24: Seminar aus Softwareentwicklung Threading unter.NET Daniel Grünberger 9855066](https://reader033.vdokument.com/reader033/viewer/2022052504/55204d8049795902118d2f6c/html5/thumbnails/24.jpg)
Synchronisation von Daten 24
Multithreading - Beispiel 2 public void doWork() { Monitor.Enter(this); string item = Convert.ToString(Thread.CurrentThread.Name) + “ “; for (int i =0; i < 10; i++) { Console.WriteLine(“Thread {0} {1} {2}”, item,i,Fib(30)); } Monitor.Exit(this); }
![Page 25: Seminar aus Softwareentwicklung Threading unter.NET Daniel Grünberger 9855066](https://reader033.vdokument.com/reader033/viewer/2022052504/55204d8049795902118d2f6c/html5/thumbnails/25.jpg)
Synchronisation von Daten 25
Ergebnis
Liefert das gewünschte Ergebnis
![Page 26: Seminar aus Softwareentwicklung Threading unter.NET Daniel Grünberger 9855066](https://reader033.vdokument.com/reader033/viewer/2022052504/55204d8049795902118d2f6c/html5/thumbnails/26.jpg)
© 2003 Daniel Grünberger 9855066 26
AppDomain
Was ist ein AppDomain?
Funktionsweise
![Page 27: Seminar aus Softwareentwicklung Threading unter.NET Daniel Grünberger 9855066](https://reader033.vdokument.com/reader033/viewer/2022052504/55204d8049795902118d2f6c/html5/thumbnails/27.jpg)
Was ist ein AppDomain 27
Was ist ein AppDomain
Ein AppDomains kann als eine Art Prozess gesehen werden, mit dem kleinen Unterschied, das dieser weniger Ressourcen verbraucht
Machen Applikation sicherer und vielseitiger
Werden auch als „leichtgewichtiger“ Prozess bezeichnet
![Page 28: Seminar aus Softwareentwicklung Threading unter.NET Daniel Grünberger 9855066](https://reader033.vdokument.com/reader033/viewer/2022052504/55204d8049795902118d2f6c/html5/thumbnails/28.jpg)
Was ist ein AppDomain 28
Was ist ein AppDomain
Jede Applikation besitzt einen Standard-AppDomain und kommt auch damit aus
Applikation kann aber beliebig viele AppDomains verwalten
Verwendung: bei Verwendung von Bibliotheken die „nicht sicheren
Code“ beinhalten -> in AppDomain kapseln Plug-Ins im Internet-Explorer …
![Page 29: Seminar aus Softwareentwicklung Threading unter.NET Daniel Grünberger 9855066](https://reader033.vdokument.com/reader033/viewer/2022052504/55204d8049795902118d2f6c/html5/thumbnails/29.jpg)
Was ist ein AppDomain 29
Was ist ein AppDomain
![Page 30: Seminar aus Softwareentwicklung Threading unter.NET Daniel Grünberger 9855066](https://reader033.vdokument.com/reader033/viewer/2022052504/55204d8049795902118d2f6c/html5/thumbnails/30.jpg)
Was ist ein AppDomain 30
Unterschiede zwischen AppDomain und einem Thread AppDomain existiert für die Dauer der
Applikation ein Thread hingegen existiert nur für eine
bestimmte Zeit innerhalb eines AppDomains
![Page 31: Seminar aus Softwareentwicklung Threading unter.NET Daniel Grünberger 9855066](https://reader033.vdokument.com/reader033/viewer/2022052504/55204d8049795902118d2f6c/html5/thumbnails/31.jpg)
Funktionsweise 31
Funktionsweise
AppDomain kann mittels der Methode CreateDomain() erzeugt werden
Beispiel:…AppDomain aDomain = AppDomain.CreateDomain(“My Domain”);…ObjectHandle objHandle = aDomain.CreateInstance( “ProgCSharp”, // der Assembly Name “ProgCSharp.Shape”, // Typ-Name mit Namensraum False, // Groß-Kleinschreibung ign. System.Reflection.BindingFlags.CreateInstance, null, // Binder new object[] {3,5}, // Argumente null, // Culture null, // Aktivierungsattribute null // Sicherheitsattribure);…
![Page 32: Seminar aus Softwareentwicklung Threading unter.NET Daniel Grünberger 9855066](https://reader033.vdokument.com/reader033/viewer/2022052504/55204d8049795902118d2f6c/html5/thumbnails/32.jpg)
Funktionsweise 32
Funktionsweise
using System;
public class MyApp {
public static int main(string[] argv) { // create Domain AppDomain child = AppDomain.CreateDomain(“childapp”); // execute int r = child.ExecuteAssembly(“yourapp.exe”,null,argv); //unload domain AppDomain.Unload(child); // return result Return r; }}
![Page 33: Seminar aus Softwareentwicklung Threading unter.NET Daniel Grünberger 9855066](https://reader033.vdokument.com/reader033/viewer/2022052504/55204d8049795902118d2f6c/html5/thumbnails/33.jpg)
Literatur 33
Literatur
Don Box, Chris Sells: Essential .NET, The Common Language Runtime, Addison-Wesley 2003
Kevin Burton: .NET Common Language Runtime Unleashed, Sams Publishing 2002
Dave Stutz, Ted Neward, Geoff Shilling: Shared Source CLI Essentials. O’Reilly 2003
Jesse Liberty: Programming C# 2nd Edition, O’Reilly & Associates Inc. 2002
![Page 34: Seminar aus Softwareentwicklung Threading unter.NET Daniel Grünberger 9855066](https://reader033.vdokument.com/reader033/viewer/2022052504/55204d8049795902118d2f6c/html5/thumbnails/34.jpg)
ENDE