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

  • Několik vláken si vyměňuje data prostřednictvím např. sdílené paměti

  • Producent - produkuje data

  • Konzument - vybírá data

  • Problémy:

    • Zajistit výlučný přístup při vkládání/vybírání z fronty
    • Fronta prázdná - musíme zablokovat konzumenta
    • Fronta plná - musíme zablokovat producenta

Vytvořeno: 7. 8. 2024, 13:25
Poslední aktualizace: 7. 8. 2024, 13:25