====== Mutex (Vzájemné vyloučení) ====== **Mutex** funguje jako digitální "zámek". V prostředí [[multitasking|multitaskingu]], kde více vláken běží současně, zabraňuje Mutex vzniku kritických chyb, jako je [[race_condition|Race Condition]], tím, že serializuje přístup ke kritické části kódu. ---- ====== Princip fungování (Analogie se záchodem) ====== Nejlepším způsobem, jak pochopit Mutex, je analogie s klíčem od toalety v restauraci: 1. V restauraci je pouze jedna toaleta (**sdílený zdroj**). 2. Kdo chce dovnitř, musí si na baru vzít jediný existující klíč (**Mutex**). 3. Jakmile je někdo uvnitř a má klíč, nikdo jiný se tam nedostane – ostatní musí počkat ve frontě. 4. Jakmile osoba toaletu opustí, vrátí klíč na bar. 5. Další osoba ve frontě si klíč vezme a může vstoupit. ---- ====== Životní cyklus Mutexu v kódu ====== Proces práce s Mutexem má obvykle tři kroky: * **Lock (Zamknutí):** Vlákno požádá o přístup. Pokud je Mutex volný, vlákno ho získá a pokračuje. Pokud je obsazený, vlákno je "uspáno" a čeká. * **Critical Section (Kritická sekce):** Vlákno provádí operace se sdílenými daty (např. zápis do databáze). * **Unlock (Odemknutí):** Vlákno uvolní Mutex, čímž dá signál operačnímu systému, že další čekající vlákno může pokračovat. ---- ====== Proč je Mutex nezbytný? ====== Bez Mutexu by mohlo dojít k poškození dat. Představte si bankovní aplikaci, kde dvě vlákna současně odečítají 100 Kč z účtu: 1. Vlákno A i B si přečtou zůstatek (např. 1000 Kč). 2. Obě vypočítají nový zůstatek (900 Kč). 3. Obě zapíšou 900 Kč. 4. **Výsledek:** Z účtu zmizelo jen 100 Kč místo 200 Kč, protože vlákna o sobě nevěděla. Mutex by zajistil, že Vlákno B začne pracovat až poté, co Vlákno A zápis dokončí. ---- ====== Rizika spojená s Mutexy ====== Ačkoliv Mutexy chrání data, jejich nesprávné použití vede k problémům: ^ Problém ^ Popis ^ | **[[deadlock|Deadlock]]** | Dvě vlákna se navzájem zablokují, protože každé drží jeden Mutex a čeká na ten, který drží to druhé. | | **Starvation (Hladovění)** | Vlákno s nízkou prioritou se nikdy nedostane k Mutexu, protože ho neustále "předbíhají" vlákna s vyšší prioritou. | | **Overhead** | Zamykání a odemykání spotřebovává čas procesoru. Příliš mnoho Mutexů může aplikaci výrazně zpomalit. | ---- ====== Rozdíl: Mutex vs. Semafor ====== Často dochází k záměně s pojmem **Semafor**. Hlavní rozdíl je v počtu: * **Mutex:** Je binární (0 nebo 1). Je to "vlastněný" zámek – pouze to vlákno, které ho zamklo, ho může odemknout. * **Semafor:** Může mít hodnotu vyšší než 1 (např. dovolí vstup 5 vláknům najednou). Slouží spíše jako počítadlo volných kapacit. ---- //Související pojmy: Thread (Vlákno), Race Condition, Deadlock, Synchronizace, Kritická sekce, Semafor.//