Middle
Co je to starvation (hladovění) v kontextu vícenásobného zpracování vláken?
sobes.tech AI
Odpověď od AI
Stav, kdy jeden nebo více gorutin (vláken, procesech) nikdy nezískají přístup ke zdroji (například mutexu, kanálu), který potřebují k pokračování v provádění, zatímco jiné gorutiny mají neustálý přístup k tomuto zdroji. To se děje kvůli nespravedlivému plánování nebo neefektivním mechanismům synchronizace, jako jsou priority nebo nadměrné držení zámků.
Příklad:
package main
import (
"fmt"
"sync"
"time"
)
var (
mu sync.Mutex
counter int
)
func worker(id int) {
for {
mu.Lock() // Chráníme zdroj (counter)
// Zde může dojít k hladu, pokud jiné gorutiny
// neustále zabírají mutex a dlouho ho drží.
counter++
fmt.Printf("Pracovník %d zvýšil čítač na %d\n", id, counter)
time.Sleep(10 * time.Millisecond) // Simulace práce
mu.Unlock()
// Přidáme malou prodlevu, aby si plánovač mohl přepnout kontext
time.Sleep(1 * time.Millisecond)
}
}
func main() {
for i := 0; i < 5; i++ {
go worker(i)
}
// Program poběží nekonečně,
// ale někteří pracovníci mohou trpět hladem
// v závislosti na plánovači a zátěži.
select {}
}
Pro minimalizaci hladu se používají:
- Spravedlivé zámky (fair locks): Zaručují, že vlákna získají přístup ke zdroji v pořadí žádosti.
- Náhodnost: Zavedení náhodnosti při výběru vlákna, které získá přístup ke zdroji.
- Timeouty: Nastavení časových limitů na čekání na zdroj.
- Prevence inverze priorit: Vyhýbání se situacím, kdy vysokoprioritní proces čeká na nízkoprioritní.
Ve Go standardní mutexy nezaručují spravedlnost, což může vést k hladu za určitých podmínek.