share: true
title: Synchronizace vláken
aliases:
- synchronizace
- synchronizace vláken
- aktivní čekání
Synchronizace vláken
-
Problém producent-konzument
-
Bez použití synchronizace
- Časově závislé chyby - více vláken zapisuje/čte společné sdílené prostředky
-
S využitím synchronizace
- Uváznutí (deadlock) - několik vláken čeká na událost, kterou může vyvolat pouze jedno z čekajících vláken
- Livelock - několik vláken vykonává neužitečný výpočet, který se nelze dokončit
- Hladovění (starvation) - vlákno je ready, ale nedostane se dlouhou dobu k prostředkům, OS ho nenaplánuje
-
Pouze jedno vlákno je uvnitř kritické sekce (přistupuje ke sdíleným prostředkům), ostatní musí počkat
Aktivní čekání
- Sdílené proměnná indikuje obsazenost kritické sekce (zámky - mutexy)
- Zatíží CPU na 100%
- Problém uváznutí v případě, že čekající vlákno má vyšší prioritu a neustále čeká
Instrukce TSL (test-and-set-lock)
- Hypotetická instrukce ke korektní implementaci aktivního čekání
- Načte lock
- Nastaví lock
- Atomická - doběhne celá, OS jí nemůže přerušit v půlce
Blokující volání
- Vlákno dokáže identifikovat proces, který ho uzamkl
- Zamčenému vláknu přestane být přidělován procesor, pasivně čeká, nezatěžuje CPU
- mutex_lock
- mutex_unlock
- std::mutex
Podmíněná proměnná
- Komunikační kanál
- Není to proměnná, nemá hodnotu
- Pamatuje si, která vlákna jsou na ní blokovány
- Vystoupí z kritické sekce, aby vlákno nespalo navěky
- cond_wait
- cont_signal
- std::conditional_variable
Semafor
- Datový typ semafor
- Obsahuje čítač
- Pamatuje si množinu vláken, která jsou na něm zablokována
- sem_init
- sem_wait
- sem_post
- V C++ není implementováno
Bariéry
- Pro problémy iteračních výpočtů
- Čítač, který definuje sílu bariéry
- Fronta vláken, která jsou na bariéře blokována
- barrier_init
- barrier_wait
- std::experimental::barrier
Synchronizační problém - Producent-konzument
Vytvořeno: 7. 8. 2024, 13:25
Poslední aktualizace: 7. 8. 2024, 13:25