Ответ
Starvation (голодание) в Go возникает, когда горутина не может получить доступ к ресурсу (например, CPU или мьютексу) в течение длительного времени из-за того, что другие горутины постоянно его монополизируют.
Пример с мьютексом:
var mu sync.Mutex
func greedy() {
for {
mu.Lock()
time.Sleep(100 * time.Millisecond) // Долгая работа с мьютексом
mu.Unlock()
}
}
func starved() {
for {
mu.Lock()
fmt.Println("I got the lock!") // Выполняется редко
mu.Unlock()
}
}
func main() {
go greedy()
go starved()
time.Sleep(time.Second)
}
Чтобы избежать starvation:
- Используйте
sync.RWMutexвместоsync.Mutexгде возможно - Ограничивайте время работы с блокировками
- Используйте каналы или другие примитивы синхронизации
- В Go 1.5+ планировщик предотвращает CPU starvation