Cvičení 3 - paralelní a asynchronní programování
Stack.cs
Zásobník
- Použijte předpřipravenou třídu „SimpleStack“ (součást zadání).
- Spusťte 5 vláken, které budou v cyklu (do nekonečna) náhodně přidávat a odebírat data ze zásobníku (zařiďte, aby častěji probíhala operace odebrání, nežli přidání).
- Ověřte, zdali zásobník funguje korektně – pokud ano, tak máte někde chybu!
- Upravte zásobník tak aby byl „thread safe“ – tedy tak aby nedocházelo k chybám při práci se zásobníkem v rámci více vláken současně (je potřeba doplnit zamykání).
Synchronizace
- Spusťte jedno vlákno, které bude využívat již připravený zásobník – každých 100ms do něj vloží jednu náhodně vygenerovanou hodnotu.
- Spusťte dalších 5 vláken, kde každé vlákno bude donekonečna dělat následující:
- V případě, že je zásobník prázdný, bude čekat, než se v něm objeví nějaká hodnota.
- V případě, že není zásobník prázdný, získá a odebere hodnotu ze zásobníku.
- Hodnotu vypíše společně s ID aktuálního vlákna do konzole.
- Uspí se na náhodný čas v rozmezí 40 až 1000ms.
- Upravte implementaci tak aby se čekání na data řešilo pomocí třídy Monitor (Wait/Pulse).
Asynchronní programování
- Vytvořte novou konzolovou aplikaci a upravte Main tak aby byl asynchronní (může být potřeba nastavit verzi jazyka na C# 7.1, nebo vyšší).
- Vytvořte novou asynchronní metodu „Experiment“. Implementujte tuto logiku:
- Vypište do konzole „Start“
- Počkejte 1000ms.
- Pomocí StreamWriter zapište libovolná data do textového souboru – asynchronně.
- Počkejte 1000ms.
- Vypište do konzole „End“.
- Zavolejte metodu Experiment v rámci metody Main.