Middle
Какво е гладуване (starvation) в контекста на многопоточността?
sobes.tech AI
Отговор от AI
Състояние, при което един или повече горутини (нишки, процеси) никога не получават достъп до ресурс (например, мютекс, канал), който им е необходим за продължаване на изпълнението, докато други горутини постоянно имат достъп до този ресурс. Това се случва поради несправедливо планиране или неефективни механизми за синхронизация, като приоритети или прекомерно задържане на блокировки.
Пример:
package main
import (
"fmt"
"sync"
"time"
)
var (
mu sync.Mutex
counter int
)
func worker(id int) {
for {
mu.Lock() // Защита на ресурса (counter)
// Тук може да възникне гладуване, ако други горутини
// постоянно захващат мютекса и го задържат дълго.
counter++
fmt.Printf("Работник %d увеличи брояча до %d\n", id, counter)
time.Sleep(10 * time.Millisecond) // Имитация на работа
mu.Unlock()
// Добавяне на малка забавяне, за да може планировчикът да превключи контекста
time.Sleep(1 * time.Millisecond)
}
}
func main() {
for i := 0; i < 5; i++ {
go worker(i)
}
// Програмата ще работи безкрайно,
// но някои работници могат да изпитват гладуване
// в зависимост от планировчика и натоварването.
select {}
}
За минимизиране на гладуването се прилагат:
- Справедливи блокировки (fair locks): Гарантират, че нишките получават достъп до ресурса в реда на заявката.
- Случайност: Въвеждане на случайност при избора на нишка, която ще получи достъп до ресурса.
- Timeouts: Задаване на ограничения във времето за очакване на ресурс.
- Предотвратяване на инверсия на приоритети: Избягване на ситуации, при които високоприоритетен процес чака нископриоритетен.
В Go стандартните мютекси не гарантират справедливост, което може да доведе до гладуване при определени условия.