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


Proč je tato chyba nebezpečná?


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.