Sobes.tech
Middle

Wat is starvation (honger) in de context van multithreading?

sobes.tech AI

Antwoord van AI

Status waarin een of meer goroutines (draad, processen) nooit toegang krijgen tot een resource (bijvoorbeeld een mutex, kanaal) die ze nodig hebben om verder te gaan, terwijl andere goroutines voortdurend toegang krijgen tot die resource. Dit gebeurt door oneerlijke planning of inefficiënte synchronisatie-mechanismen, zoals prioriteiten of overmatig vasthouden van blokkades.

Voorbeeld:

package main

import (
	"fmt"
	"sync"
	"time"
)

var (
	mu      sync.Mutex
	counter int
)

func worker(id int) {
	for {
		mu.Lock() // Resource (counter) beveiligen
		// Hier kan hongersnood ontstaan als andere goroutines
		// constant de mutex pakken en lang vasthouden.
		counter++
		fmt.Printf("Werker %d heeft teller verhoogd tot %d\n", id, counter)
		time.Sleep(10 * time.Millisecond) // Werk simulatie
		mu.Unlock()
		// Voeg een kleine vertraging toe zodat de scheduler kan wisselen
		time.Sleep(1 * time.Millisecond)
	}
}

func main() {
	for i := 0; i < 5; i++ {
		go worker(i)
	}

	// Het programma draait oneindig,
	// maar sommige workers kunnen hongersnood ervaren
	// afhankelijk van de scheduler en de belasting.
	select {}
}

Om hongersnood te minimaliseren worden toegepast:

  • Eerlijke locks (fair locks): Garanderen dat threads toegang krijgen tot de resource in de volgorde van aanvraag.
  • Willekeurigheid: Invoeren van willekeur bij de selectie van de thread die toegang krijgt tot de resource.
  • Timeouts: Instellen van tijdslimieten voor het wachten op een resource.
  • Prioriteitsinversie voorkomen: Voorkomen dat een hoogprioriteitsproces wacht op een laagprioriteitsproces.

In Go garanderen standaard mutexes geen eerlijkheid, wat kan leiden tot hongersnood onder bepaalde omstandigheden.