Uživatelské nástroje

Nástroje pro tento web


race_condition

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.

race_condition.txt · Poslední úprava: autor: admin