Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Seminar aus Softwareentwicklung Threading unter.NET Daniel Grünberger 9855066.

Ähnliche Präsentationen


Präsentation zum Thema: "Seminar aus Softwareentwicklung Threading unter.NET Daniel Grünberger 9855066."—  Präsentation transkript:

1 Seminar aus Softwareentwicklung Threading unter.NET Daniel Grünberger

2 Inhalt2 Geschichtlicher Hintergrund Überblick über Threads Synchronisation von Daten AppDomain Literatur

3 Geschichtlicher Hintergrund3 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

4 Überblick über Threads4 Was ist ein Thread? Erstellen eines Threads Übergabe von Daten an Threads

5 Was ist ein Thread5 Ein Thread: bezeichnet eine selbständig ausführbare Programm-Funktion kann unabhängig vom übrigen Programm ausgeführt werden kann so dutzende von Teilaufgaben scheinbar gleichzeitig ausführen

6 Was ist ein Thread6 Verwendung Falls Programm mehrere Dinge gleichzeitig machen soll, setzt man Threads ein Beispiel: Berechnung der Zahl PI (3, …) bis auf die Millionste Stelle genau Ohne Thread: Programm läuft ein paar Millionen Jahre ohne Output Mit Thread: Programm kann jederzeit unterbrochen werden

7 Erstellen eines Thread7 Klassen/Funktionen für Threads sind im Namensraum System.Threading zu finden z.B.: Start() Join() Sleep() Abort()...

8 Erstellen eines Thread8 Zustandsdiagramm

9 Erstellen eines Thread9 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!

10 Übergabe von Daten an Threads10 Übergabe von Daten an Threads 3 Möglichkeiten Daten zu übergeben: Verwendung von globalen Variablen Kapselung des Entrypoints in eine eigene Klasse Verwendung von thread local storage (TLS)

11 Übergabe von Daten an Threads11 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

12 Übergabe von Daten an Threads12 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

13 Übergabe von Daten an Threads13 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

14 Synchronisation von Daten14 Synchronisation von Daten Relativ einfache Datenübergabe an Threads Jedoch Problem bei Multithreading – falls mehrere Threads auf gleiche Daten / Ressourcen zugreifen wollen

15 Synchronisation von Daten15 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

16 Synchronisation von Daten16 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

17 Synchronisation von Daten17 Ergebnis? Nicht Zufriedenstellend!!

18 Synchronisation von Daten18 Warum? Jeder Thread versucht CPU-Leistung zu bekommen Kein geordnetes vorgehen Im schlimmsten Fall kann es Threads geben, die niemals CPU-Leistung bekommen

19 Synchronisation von Daten19 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,…

20 © 2003 Daniel Grünberger 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

21 Synchronisation von Daten21 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

22 Synchronisation von Daten22 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

23 Synchronisation von Daten23 Funktion Monitor – Lock Monitor.Enter(this) // kritische Ausführung Monitor.Exit(this); Bzw. try { Monitor.Enter(this); // kritische Ausführung} Finally { Monitor.Exit(this) } entspricht: lock(this) { //kritische Ausführung }

24 Synchronisation von Daten24 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); }

25 Synchronisation von Daten25 Ergebnis Liefert das gewünschte Ergebnis

26 © 2003 Daniel Grünberger AppDomain Was ist ein AppDomain? Funktionsweise

27 Was ist ein AppDomain27 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

28 Was ist ein AppDomain28 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 …

29 Was ist ein AppDomain29 Was ist ein AppDomain

30 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

31 Funktionsweise31 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 ); …

32 Funktionsweise32 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; }

33 Literatur33 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. OReilly 2003 Jesse Liberty: Programming C# 2nd Edition, OReilly & Associates Inc. 2002

34 ENDE


Herunterladen ppt "Seminar aus Softwareentwicklung Threading unter.NET Daniel Grünberger 9855066."

Ähnliche Präsentationen


Google-Anzeigen