Middle
Quels types de mutex fournit la bibliothèque standard de Go?
sobes.tech IA
Réponse de l'IA
La bibliothèque standard de Go fournit deux types principaux de mutex dans le paquet sync :
sync.Mutex: Mutex de base assurant une exclusion mutuelle. Peut être dans deux états : bloqué ou débloqué. Seule une goroutine peut maintenir le verrouillage à un moment donné.sync.RWMutex: Mutex pour lecture/écriture. Permet à plusieurs goroutines de lire simultanément (en obtenant RLock), mais une seule peut écrire (en obtenant Lock). L'écriture bloque toutes les opérations (lecture et écriture).
Méthodes principales de sync.Mutex :
| Méthode | Description |
|---|---|
Lock() |
Bloque le mutex. Si déjà bloqué, la goroutine appelante se bloque jusqu'à ce qu'il soit libéré. |
Unlock() |
Débloque le mutex. Panique si le mutex n'était pas bloqué par la goroutine appelante. |
Méthodes principales de sync.RWMutex :
| Méthode | Description |
|---|---|
Lock() |
Bloque le mutex pour l'écriture. Bloque toutes les opérations de lecture et d'écriture. |
Unlock() |
Débloque le mutex pour l'écriture. Panique si le mutex n'était pas bloqué pour l'écriture. |
RLock() |
Bloque le mutex pour la lecture. Ne bloque pas d'autres opérations de lecture. Se bloque s'il y a un verrouillage en écriture. |
RUnlock() |
Débloque le mutex pour la lecture. Panique si le mutex n'était pas bloqué pour la lecture. |
RLocker() |
Retourne un Locker utilisant RLock et RUnlock. |
Exemple d'utilisation de sync.Mutex :
package main
import (
"fmt"
"sync"
"time"
)
var counter int
var mutex sync.Mutex
func increment() {
mutex.Lock() // Bloque le mutex
counter++
fmt.Printf("Counter : %d\n", counter)
mutex.Unlock() // Débloque le mutex
}
func main() {
for i := 0; i < 10; i++ {
go increment()
}
time.Sleep(time.Second) // Donne le temps aux goroutines de finir
}
Exemple d'utilisation de sync.RWMutex :
package main
import (
"fmt"
"sync"
"time"
)
var data string
var rwMutex sync.RWMutex
func readData() {
rwMutex.RLock() // Bloque pour lecture
fmt.Printf("Lecture des données : %s\n", data)
rwMutex.RUnlock() // Débloque pour lecture
}
func writeData(newData string) {
rwMutex.Lock() // Bloque pour écriture
data = newData
fmt.Printf("Écriture des données : %s\n", data)
rwMutex.Unlock() // Débloque pour écriture
}
func main() {
go writeData("Bonjour")
time.Sleep(100 * time.Millisecond) // Donne du temps pour l'écriture
for i := 0; i < 5; i++ {
go readData() // Plusieurs lectures simultanées autorisées
}
time.Sleep(time.Second) // Donne le temps aux goroutines de finir
go writeData("Monde")
time.Sleep(100 * time.Millisecond)
go readData()
time.Sleep(time.Second)
}