Common Language Runtime Multithreading
Multithreading i.net Dedicated threads Programmøren kontrollerer starttidspunkt, levetid m.m. for den enkelte thread. Pooled threads Threads lånes fra en pulje af threads (Thread Pool). Side 2 Elsam Engineering 08-03-2005
Dedicated Threads System.Threading.Thread Use cases Prioritering af threads Holde processen i live (IsBackground=false) Tidskrævende/blokerende operationer Side 3 Elsam Engineering 08-03-2005
Side 4 Elsam Engineering 08-03-2005
Stopping Threads Eksekvering stopper når target metode returnerer Via normal program flow eller exception Brugerdefineret terminering skal implementeres Worker thread monitorerer et flag Controlling thread sætter flaget når terminering skal påbegyndes Controlling thread venter på at terminering er afsluttet Side 5 Elsam Engineering 08-03-2005
Side 6 Elsam Engineering 08-03-2005
Pooled Threads Mange samtidige threads påvirker performance (scalability) F.eks.: Server opretter ny thread til håndtering af hver request F.eks.: GUI der tillader, at vilkårligt mange baggrundsprocesser startes Dyrt at oprette og starte threads Der bruges mere tid på thread administration end på at udføre arbejde. Side 7 Elsam Engineering 08-03-2005
Thread Pool Model Threads lånes fra en pool af præ-eksisterende threads. Pool initialiseres med et lille antal threads Arbejde der ønskes udført af en pool thread sættes i kø Når en pool thread er ledig tildeles den arbejde fra køen (såfremt køen ikke er tom) Thread Pool en håndterer oprettelse og nedlæggelse af threads på basis af workload Side 8 Elsam Engineering 08-03-2005
Thread Pool Model En (built-in) thread pool pr. proces Arbejde der er sat i kø kan ikke fjernes Threads kan ikke prioriteres i forhold til hinanden En pool thread vil ikke holde processen kørende (IsBackground = true) Indsættelse af arbejde i Thread Pool køen sker via Delegates Delegate.BeginInvoke( ) Delegate.EndInvoke( ) Side 9 Elsam Engineering 08-03-2005
delegate void RunDelegate(int threadno); static void Main(string[] args) { for (int i=0; i<50; i++) { RunDelegate rd = new RunDelegate(Run); rd.begininvoke(i, new AsyncCallback(RunComplete), i); } Console.WriteLine("50 threads queued!"); Console.ReadLine(); } public static void Run(int threadno) { Console.WriteLine("Hello from thread " + threadno); Thread.Sleep(15000); } public static void RunComplete(IAsyncResult iar) { AsyncResult ar = (AsyncResult)iar; RunDelegate rd = (RunDelegate)ar.AsyncDelegate; rd.endinvoke(iar); } Console.WriteLine("Goodbye from thread " + (int)iar.asyncstate); Side 10 Elsam Engineering 08-03-2005
Thread Pool Model Forskellige muligheder for at høste resultatet når en thread er termineret Callback (AsyncCallback argument til BeginInvoke) Poll (IAsyncResult.IsCompleted) Call EndInvoke (blokerer indtil thread metoden terminerer) Uanset hvad skal EndInvoke altid kaldes Side 11 Elsam Engineering 08-03-2005
Data tilgang i en multithreaded verden Hvis data kun læses ingen problemer!! Hvis data også opdateres problemer!! Hvis man er heldig crasher applikationen Hvis man er uheldig har man data korruption uden at crashe Hvis man er rigtig uheldig virker applikationen indtil man har sendt den på markedet! Løsning: lås på data så de kun kan tilgåes fra én thread ad gangen Side 12 Elsam Engineering 08-03-2005
Monitor Den primære thread synkroniseringsmekanisme i.net Låsning af data Monitor.Enter() Frigivning af data Monitor.Exit() C# har exception-safe wrapper (lock) Side 13 Elsam Engineering 08-03-2005
Side 14 Elsam Engineering 08-03-2005
Side 15 Elsam Engineering 08-03-2005
Andre synkroniseringsmekanismer Monitor TryEnter allows for time-limited waits ReaderWriterLock multi-reader/single-writer Mutex CLR wrapper around Win32 kernel object Semaphore - CLR wrapper around Win32 kernel object (.NET 2.0 only) Side 16 Elsam Engineering 08-03-2005
Common Language Runtime Multithreading i WinForms
Multithreading i WinForms Baseret på Win32 message loop En control kan kun tilgåes fra den thread der oprettede den Forsøg på at tilgå en control fra en anden thread vil måske forårsage en exception Tilgang fra anden thread skal foregå via ISynchronizeInvoke bool InvokeRequired Invoke( ) Side 18 Elsam Engineering 08-03-2005
Eksempel: Multithreading i WinForms Side 19 Elsam Engineering 08-03-2005
Side 20 Elsam Engineering 08-03-2005
Side 21 Elsam Engineering 08-03-2005
Side 22 Elsam Engineering 08-03-2005
Side 23 Elsam Engineering 08-03-2005
Side 24 Elsam Engineering 08-03-2005
Side 25 Elsam Engineering 08-03-2005