Použití, výhody, async/await, thread, Task, Parallel, vracení a předávání dat mezi vlákny, synchronizace

Formát: 30 min praktická úloha, 15 min obhajoba + teorie. Teorie pokrývá threads, tasks, async/await, Parallel a synchronizaci. Praktika: hledání maxima paralelně vs sekvenčně s měřením času.


Část 1: Teorie

Proč to potřebujeme

Moderní procesory mají více jader (cores). Program běžící v jednom vlákně využívá jen jedno jádro, ostatní jsou nečinná. Paralelní a asynchronní programování umožňuje:

Klasický příklad: webový server zpracovává 1000 požadavků současně. Bez paralelismu by každý uživatel čekal, než server vyřídí předchozího.


Concurrent vs Parallel

Pojem Význam
Concurrent (souběžný) Více úloh se střídá na jednom jádře (rychlé přepínání). Vypadá to paralelně.
Parallel (paralelní) Více úloh běží opravdu současně na různých jádrech.
Concurrent (1 jádro, střídání):
  Jádro 1: [A][B][A][B][A][B][A]   ← rychlé přepínání mezi úlohami

Parallel (2 jádra, opravdu zároveň):
  Jádro 1: [A][A][A][A][A][A][A]
  Jádro 2: [B][B][B][B][B][B][B]

V praxi se pojmy často zaměňují. .NET ti to navíc skrývá: napíšeš Task.Run(...) a runtime se rozhodne, zda ho pustí na samostatném jádru, nebo přidá do fronty.


CPU-bound vs I/O-bound

Klíčové rozdělení úloh:

Typ Co dělá Jak řešit
CPU-bound Náročný výpočet (faktoriál, šifrování, zpracování obrazu) Task.Run, Parallel.For (využít víc jader)
I/O-bound Čeká na vnější zdroj (disk, síť, DB) async/await (vlákno se uvolní pro jinou práci)

Pravidlo: Task.Run použij na výpočty. await použij na čekání. Když to obrátíš, plýtváš zdroji.