Obsah
Race Condition (Souběh)
Race Condition nastává v situaci, kdy dvě nebo více vláken přistupují ke sdíleným datům a snaží se je změnit ve stejný okamžik. Protože operační systém může vlákna kdykoliv přerušit a vystřídat, konečný stav dat závisí na tom, které vlákno „doběhne“ k zápisu jako první.
Mechanismus vzniku: Problém "Přečti-Uprav-Zapiš"
Většina operací, které se zdají být jednoduché (např. x = x + 1), se na úrovni procesoru skládá ze tří kroků. Pokud do nich zasáhne jiné vlákno, vzniká chaos.
Scénář chyby:
Představme si sdílenou proměnnou Hodnota = 10 a dvě vlákna, která chtějí přičíst 1.
1. **Vlákno A** si přečte hodnotu (10). 2. *Systém přeruší Vlákno A a spustí Vlákno B.* 3. **Vlákno B** si přečte hodnotu (stále 10). 4. **Vlákno B** přičte 1 a zapíše výsledek (**11**). 5. *Systém přepne zpět na Vlákno A.* 6. **Vlákno A** (které si pamatuje 10) přičte 1 a zapíše výsledek (**11**).
Výsledek: Místo očekávané hodnoty 12 (protože proběhly dvě operace) je v paměti pouze 11. Jedna operace se „ztratila“.
Typy Race Condition
- Kritická sekce: Nejčastější typ (viz příklad výše), kdy více vláken manipuluje se stejnou proměnnou nebo souborem bez ochrany.
- Check-then-act: Vlákno zkontroluje podmínku (např. „existuje soubor?“) a poté provede akci. Mezi kontrolou a akcí však může jiné vlákno soubor smazat, což vede k pádu aplikace.
Proč je tato chyba nebezpečná?
- Nedeterminismus: Program funguje správně v 99 % případů. Chyba se objeví jen tehdy, když dojde k naprosto přesnému (a nešťastnému) souběhu milisekund.
- Heisenbug: Termín pro chyby, které zmizí, když se je pokusíte sledovat (např. přidáním výpisů do konzole, což změní časování vláken a chybu „maskuje“).
- Bezpečnostní riziko: Útočníci mohou Race Condition využít k obcházení kontrol (např. v bankovnictví nebo při ověřování hesel).
Jak se Race Condition bránit?
Základem obrany je zajistit, aby operace se sdílenými daty byly atomické (nepřerušitelné).
1. **[[mutex|Mutex]] (Zamykání):** Vlákno si "zamkne" data pro sebe a ostatní musí počkat, dokud operaci nedokončí. 2. **Atomické operace:** Speciální instrukce procesoru, které provedou "Přečti-Uprav-Zapiš" jako jeden nedělitelný krok na hardwarové úrovni. 3. **Neměnnost (Immutability):** Návrh systému tak, aby se data po vytvoření už nikdy neměnila (vlákna vždy vytvářejí novou kopii).
Příklad z reálného světa: Therac-25
Jedním z nejtragičtějších příkladů Race Condition byl ozařovací přístroj Therac-25 v 80. letech. Kvůli chybě v časování softwaru docházelo k tomu, že přístroj vyslal smrtelnou dávku záření, pokud operátor zadal příkazy příliš rychle za sebou.
Související pojmy: Thread (Vlákno), Mutex, Deadlock, Multitasking, Synchronizace, Atomická operace.
