Middle
Milyen típusú mutexeket biztosít a Go szabványos könyvtára?
sobes.tech MI
Válasz az MI-től
A Go standard könyvtár két fő típusú zárolási mechanizmust kínál a sync csomagban:
sync.Mutex: Alap zárolás, amely kizárólagos zárolást biztosít. Két állapota lehet: zárolva vagy feloldva. Csak egy goroutine tarthatja zárolva egyszerre.sync.RWMutex: Olvasási/írási zárolás. Lehetővé teszi több goroutine számára az adatok olvasását (RLock), de csak egynek az írását (Lock). Az írás zárol minden olvasási és írási műveletet.
A sync.Mutex főbb metódusai:
| Metódus | Leírás |
|---|---|
Lock() |
Zárolja a zárolást. Ha már zárolva van, a hívó goroutine várakozik a feloldására. |
Unlock() |
Feloldja a zárolást. Pánik lép fel, ha a zárolás nem volt zárolva a hívó goroutine által. |
A sync.RWMutex főbb metódusai:
| Metódus | Leírás |
|---|---|
Lock() |
Zárolja írásra. Minden olvasási és írási műveletet blokkol. |
Unlock() |
Feloldja az írási zárolást. Pánik lép fel, ha nem volt zárolva írásra. |
RLock() |
Zárolja olvasásra. Nem blokkol más olvasási műveleteket. Blokkolódik, ha írási zárolás van. |
RUnlock() |
Feloldja az olvasási zárolást. Pánik lép fel, ha nem volt zárolva olvasásra. |
RLocker() |
Visszaad egy Locker-t, amely az RLock és RUnlock-ot használja. |
Példa a sync.Mutex használatára:
package main
import (
"fmt"
"sync"
"time"
)
var counter int
var mutex sync.Mutex
func increment() {
mutex.Lock() // Zároljuk a zárolást
counter++
fmt.Printf("Counter: %d\n", counter)
mutex.Unlock() // Feloldjuk a zárolást
}
func main() {
for i := 0; i < 10; i++ {
go increment()
}
time.Sleep(time.Second) // Várunk, hogy a goroutine-ok befejeződjenek
}
Példa az sync.RWMutex használatára:
package main
import (
"fmt"
"sync"
"time"
)
var data string
var rwMutex sync.RWMutex
func readData() {
rwMutex.RLock() // Olvasásra zárol
fmt.Printf("Olvasott adat: %s\n", data)
rwMutex.RUnlock() // Feloldás olvasásra
}
func writeData(newData string) {
rwMutex.Lock() // Írásra zárol
data = newData
fmt.Printf("Írt adat: %s\n", data)
rwMutex.Unlock() // Feloldás írásra
}
func main() {
go writeData("Hello")
time.Sleep(100 * time.Millisecond) // Várunk az írásra
for i := 0; i < 5; i++ {
go readData() // Több olvasás engedélyezett egyszerre
}
time.Sleep(time.Second) // Várunk a goroutine-ok befejezésére
go writeData("World")
time.Sleep(100 * time.Millisecond)
go readData()
time.Sleep(time.Second)
}