Middle
Čo je to hladovanie (starvation) v kontexte viacvláknového programovania?
sobes.tech AI
Odpoveď od AI
Stav, keď jeden alebo viac gorutín (vlákien, procesov) nikdy nezískajú prístup ku zdroju (napríklad mutexu, kanálu), ktorý potrebujú na pokračovanie v vykonávaní, zatiaľ čo iné gorutiny majú neustály prístup k tomuto zdroju. To sa deje kvôli nespravodlivému plánovaniu alebo neefektívnym mechanizmom synchronizácie, ako sú priority alebo nadmerné držanie zámkov.
Príklad:
package main
import (
"fmt"
"sync"
"time"
)
var (
mu sync.Mutex
counter int
)
func worker(id int) {
for {
mu.Lock() // Chrániť zdroj (counter)
// Tu môže nastať hladovanie, ak iné gorutiny
// neustále zachytávajú mutex a dlhodobo ho držia.
counter++
fmt.Printf("Pracovník %d zvýšil čítač na %d\n", id, counter)
time.Sleep(10 * time.Millisecond) // Simulácia práce
mu.Unlock()
// Pridanie malej oneskorenia, aby si plánovač mohol prepnúť kontext
time.Sleep(1 * time.Millisecond)
}
}
func main() {
for i := 0; i < 5; i++ {
go worker(i)
}
// Program bude bežať nekonečne,
// ale niektorí pracovníci môžu zažívať hladovanie
// v závislosti od plánovača a záťaže.
select {}
}
Na minimalizáciu hladu sa používajú:
- Spravodlivé zámky (fair locks): Zaručujú, že vlákna získajú prístup k zdroju v poradí žiadosti.
- Náhodnosť: Zavedenie náhodnosti pri výbere vlákna, ktoré získa prístup k zdroju.
- Timeouty: Nastavenie časových limitov na čakanie na zdroj.
- Prevencia inverzie priorít: Vyhýbanie sa situáciám, keď vysokoprioritný proces čaká na nízkoprioritný.
V Go štandardné mutexy nezaručujú spravodlivosť, čo môže viesť k hladu v určitých podmienkach.