Szálszinkronizáció
Versenyhelyzet static int sum = 0; static void Main(string[] args) { Thread th01 = new Thread(Szamol); Thread th02 = new Thread(Szamol); th01.Start(); th02.Start(); th01.Join(); th02.Join(); Console.WriteLine("Sum: " + sum); Console.ReadLine(); } static void Szamol() for (int i = 0; i < 50000; i++) sum = sum + 1; Megj. hívjátok fel a figyelmet, hogy a kód nem jó (Start(), Join() egymás utáni sorokban egyből ki is nyírja a párhuzamosságot)
Versenyhelyzet: lock static int sum = 0; static object lockObject = new Object(); static void Main(string[] args) { Thread th01 = new Thread(Szamol); Thread th02 = new Thread(Szamol); th01.Start(); th02.Start(); th01.Join(); th02.Join(); Console.WriteLine("Sum: " + sum); Console.ReadLine(); } static void Szamol() lock (lockObject) for (int i = 0; i < 50000; i++) sum = sum + 1; Megj. hívjátok fel a figyelmet, hogy a kód nem jó (Start(), Join() egymás utáni sorokban egyből ki is nyírja a párhuzamosságot)
Versenyhelyzet: atomi művelet static int sum = 0; static void Main(string[] args) { Thread th01 = new Thread(Szamol); Thread th02 = new Thread(Szamol); th01.Start(); th02.Start(); th01.Join(); th02.Join(); Console.WriteLine("Sum: " + sum); Console.ReadLine(); } static void Szamol() for (int i = 0; i < 50000; i++) Interlocked.Increment(ref sum); Megj. hívjátok fel a figyelmet, hogy a kód nem jó (Start(), Join() egymás utáni sorokban egyből ki is nyírja a párhuzamosságot)
Emlékeztető using System; using System.Threading; class Program { private static int counter = 0; private static object lockObject = new Object(); static void Main(string[] args) Thread t1 = new Thread(ThreadMethod); t1.Start(); Thread t2 = new Thread(ThreadMethod); t2.Start(); } private static void ThreadMethod() lock (lockObject) counter++; Thread.Sleep(500); Console.WriteLine("A számláló állása: " + counter); 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 Figyelem: SOHA ne írjunk le az alábbiakra hasonlító kódot: lock (this) vagy lock (typeof(Program)) azaz sose lockoljunk olyat, amiről nem tudjuk befolyásolni, ki fér hozzá A lock utasítás nélkül a metódus sorosan (egy szálon futtatva) helyesen működik, párhuzamosan (több szálon) azonban nem Forrás: Haladó Programozás labor anyagai
Parallel osztály int[] A = new int[] { 2, 4, 6, 8, 3, 1, 5, 7, 2, 0 }; Parallel.For(0, A.Length, i => Console.WriteLine(A[i]) ); Parallel.For(0, 100, i => Console.Write(i + " ")); Parallel.ForEach(A, i => Console.Write(i + " ")); Parallel.Invoke( () => Console.WriteLine("A"), () => Console.WriteLine("B"), () => Console.WriteLine("C"), () => Console.WriteLine("D"), () => Console.WriteLine("E") Megj. hívjátok fel a figyelmet, hogy a kód nem jó (Start(), Join() egymás utáni sorokban egyből ki is nyírja a párhuzamosságot)
Holtpont static class DemoStaticClass { static int idx; static DemoStaticClass() //statikus konstruktor Task.Run(() => Valami()).Wait(); } static int InitValue { get { return 42; } } public static void Valami() { idx++; Console.WriteLine("valami"); } DemoStaticClass.Valami(); //a statikus konstruktor pont azelott fut le //hogy az osztaly valamely tagjat eloszor elernenk Console.WriteLine("ok"); //ide nem jut el Megj. hívjátok fel a figyelmet, hogy a kód nem jó (Start(), Join() egymás utáni sorokban egyből ki is nyírja a párhuzamosságot)
Feladat Számoljuk meg, hány prímszám van 1 és 10 000 000 között! Az egyszerűség kedvéért az alábbi függvény segítségével döntsük el egy számról, hogy prím-e: static bool PrimSzamE(int szam) { if (szam <= 1) return false; if (szam <= 3) return true; for (int i = 2; i <= (int)Math.Sqrt(szam); i++) if (szam % i == 0) return false; return true; } Oldjuk meg a feladatot szekvenciálisan! Mennyi ideig tart? Oldjuk meg a feladatot Taskok segítségével! Alkalmazzuk a Parallel.For-t a megoldáshoz!
Feladat Készítsünk programot, amelyben 4 Task versenyez a konzolra íráson! Az egyes Taskok külön sorokba, különböző színnel írhatnak. Tipp: Console.SetCursorPosition(y, x); Console.ForegroundColor = c; Console.Write(s); Megjegyzés: a konzol ebben az esetben konkurrensen elért erőforrás, így a szinkronizációra ügyelni kell!