Cvičení 3 - paralelní a asynchronní programování

Stack.cs

Zásobník

  1. Použijte předpřipravenou třídu „SimpleStack“ (součást zadání).
  2. 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í).
  3. Ověřte, zdali zásobník funguje korektně – pokud ano, tak máte někde chybu!
  4. 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

  1. 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.
  2. Spusťte dalších 5 vláken, kde každé vlákno bude donekonečna dělat následující:
    1. V případě, že je zásobník prázdný, bude čekat, než se v něm objeví nějaká hodnota.
    2. V případě, že není zásobník prázdný, získá a odebere hodnotu ze zásobníku.
    3. Hodnotu vypíše společně s ID aktuálního vlákna do konzole.
    4. Uspí se na náhodný čas v rozmezí 40 až 1000ms.
  3. Upravte implementaci tak aby se čekání na data řešilo pomocí třídy Monitor (Wait/Pulse).

Asynchronní programování

  1. 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šší).
  2. Vytvořte novou asynchronní metodu „Experiment“. Implementujte tuto logiku:
    1. Vypište do konzole „Start“
    2. Počkejte 1000ms.
    3. Pomocí StreamWriter zapište libovolná data do textového souboru – asynchronně.
    4. Počkejte 1000ms.
    5. Vypište do konzole „End“.
  3. Zavolejte metodu Experiment v rámci metody Main.