Middle
Welke soorten mutexes biedt de standaardbibliotheek van Go?
sobes.tech AI
Antwoord van AI
De standaardbibliotheek van Go biedt twee hoofdtypen mutexen in het sync-pakket:
sync.Mutex: Een basismutex die onderlinge uitsluiting garandeert. Het kan in twee toestanden zijn: geblokkeerd of ontgrendeld. Slechts één goroutine kan op een gegeven moment de lock vasthouden.sync.RWMutex: Een mutex voor lezen/schrijven. Hiermee kunnen meerdere goroutines gelijktijdig lezen (doorRLock), maar slechts één schrijven (doorLock). Schrijven blokkeert alle operaties (zowel lezen als schrijven).
Belangrijkste methoden van sync.Mutex:
| Methode | Beschrijving |
|---|---|
Lock() |
Blokkeert de mutex. Als deze al geblokkeerd is, wordt de oproepende goroutine geblokkeerd tot deze wordt vrijgegeven. |
Unlock() |
Ontgrendelt de mutex. Geeft een panic als de mutex niet was vergrendeld door de oproepende goroutine. |
Belangrijkste methoden van sync.RWMutex:
| Methode | Beschrijving |
|---|---|
Lock() |
Blokkeert de mutex voor schrijven. Blokkeert alle lees- en schrijfbewerkingen. |
Unlock() |
Ontgrendelt de mutex voor schrijven. Geeft een panic als de mutex niet was vergrendeld voor schrijven. |
RLock() |
Blokkeert de mutex voor lezen. Blokkeert andere leesbewerkingen niet. Wordt geblokkeerd als er een schrijflock is. |
RUnlock() |
Ontgrendelt de mutex voor lezen. Geeft een panic als de mutex niet was vergrendeld voor lezen. |
RLocker() |
Geeft een Locker die RLock en RUnlock gebruikt. |
Voorbeeld van gebruik van sync.Mutex:
package main
import (
"fmt"
"sync"
"time"
)
var counter int
var mutex sync.Mutex
func increment() {
mutex.Lock() // Blokkeert de mutex
counter++
fmt.Printf("Counter: %d\n", counter)
mutex.Unlock() // Ontgrendelt de mutex
}
func main() {
for i := 0; i < 10; i++ {
go increment()
}
time.Sleep(time.Second) // Geeft de goroutines de tijd om te voltooien
}
Voorbeeld van gebruik van sync.RWMutex:
package main
import (
"fmt"
"sync"
"time"
)
var data string
var rwMutex sync.RWMutex
func readData() {
rwMutex.RLock() // Blokkeert voor lezen
fmt.Printf("Lezen van data: %s\n", data)
rwMutex.RUnlock() // Ontgrendelt voor lezen
}
func writeData(newData string) {
rwMutex.Lock() // Blokkeert voor schrijven
data = newData
fmt.Printf("Schrijven van data: %s\n", data)
rwMutex.Unlock() // Ontgrendelt voor schrijven
}
func main() {
go writeData("Hallo")
time.Sleep(100 * time.Millisecond) // Geeft tijd voor schrijven
for i := 0; i < 5; i++ {
go readData() // Meerdere gelijktijdige lezingen zijn toegestaan
}
time.Sleep(time.Second) // Geeft tijd voor de goroutines
go writeData("Wereld")
time.Sleep(100 * time.Millisecond)
go readData()
time.Sleep(time.Second) // Wacht tot alles klaar is
}