Sobes.tech
Middle

Ce tipuri de mutex-uri oferă biblioteca standard Go?

sobes.tech AI

Răspuns de la AI

Biblioteca standard Go oferă două tipuri principale de mutex-uri în pachetul sync:

  • sync.Mutex: Un mutex de bază care asigură excluderea mutuală. Poate fi în două stări: blocat sau deblocat. Doar o gorutină poate menține blocarea la un moment dat.
  • sync.RWMutex: Un mutex pentru citire/scriere. Permite mai multor gorutine să citească simultan (prin RLock), dar doar uneia să scrie (prin Lock). Scrierea blochează toate operațiile (atât citire, cât și scriere).

Metode principale ale sync.Mutex:

Metodă Descriere
Lock() Blochează mutex-ul. Dacă este deja blocat, gorutina apelantă se blochează până când este deblocat.
Unlock() Deblochează mutex-ul. Panică dacă mutex-ul nu era blocat de gorutina apelantă.

Metode principale ale sync.RWMutex:

Metodă Descriere
Lock() Blochează mutex-ul pentru scriere. Blochează toate operațiile de citire și scriere.
Unlock() Deblochează mutex-ul pentru scriere. Panică dacă mutex-ul nu era blocat pentru scriere.
RLock() Blochează mutex-ul pentru citire. Nu blochează alte operații de citire. Se blochează dacă există o blocare de scriere.
RUnlock() Deblochează mutex-ul pentru citire. Panică dacă mutex-ul nu era blocat pentru citire.
RLocker() Returnează un Locker care folosește RLock și RUnlock.

Exemplu de utilizare a sync.Mutex:

package main

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

var counter int
var mutex sync.Mutex

func increment() {
	mutex.Lock() // Blochează mutex-ul
	counter++
	fmt.Printf("Counter: %d\n", counter)
	mutex.Unlock() // Deblochează mutex-ul
}

func main() {
	for i := 0; i < 10; i++ {
		go increment()
	}
	time.Sleep(time.Second) // Așteaptă ca gorutinele să se termine
}

Exemplu de utilizare a sync.RWMutex:

package main

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

var data string
var rwMutex sync.RWMutex

func readData() {
	rwMutex.RLock() // Blochează pentru citire
	fmt.Printf("Citire date: %s\n", data)
	rwMutex.RUnlock() // Deblochează pentru citire
}

func writeData(newData string) {
	rwMutex.Lock() // Blochează pentru scriere
	data = newData
	fmt.Printf("Scriere date: %s\n", data)
	rwMutex.Unlock() // Deblochează pentru scriere
}

func main() {
	go writeData("Salut")
	time.Sleep(100 * time.Millisecond) // Așteaptă pentru scriere

	for i := 0; i < 5; i++ {
		go readData() // Multe citiri simultane sunt permise
	}

	time.Sleep(time.Second) // Așteaptă ca gorutinele să se termine
	go writeData("Lume")
	time.Sleep(100 * time.Millisecond)
	go readData()

	time.Sleep(time.Second) // Așteaptă finalizarea
}