Sobes.tech
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)
}