Middle
Kādus mutex tipus nodrošina Go standarta bibliotēka?
sobes.tech AI
Atbilde no AI
Standarta Go bibliotēka sync paketā piedāvā divus galvenos tipa slēdžus:
sync.Mutex: Galvenais slēdzis, kas nodrošina savstarpēju izslēgšanu. Tas var būt divos stāvokļos: aizslēgts vai atslēgts. Tikai viena gorutīna var turēt slēdzeni vienlaikus.sync.RWMutex: Lasīšanas/ieraksta slēdzis. Tas ļauj vairākām gorutīnām vienlaikus lasīt datus (RLock), bet tikai vienai rakstīt (Lock). Rakstīšana bloķē visas operācijas (gan lasīšanu, gan rakstīšanu).
Galvenās sync.Mutex metodes:
| Metode | Apraksts |
|---|---|
Lock() |
Aizslēdz slēdzeni. Ja tas jau ir aizslēgts, izsaucēja gorutīna gaidīs tā atbrīvošanu. |
Unlock() |
Atbrīvo slēdzeni. Notiek panika, ja slēdzene nebija aizslēgta izsaucējas gorutīnas. |
Galvenās sync.RWMutex metodes:
| Metode | Apraksts |
|---|---|
Lock() |
Aizslēdz slēdzeni rakstīšanai. Bloķē visas lasīšanas un rakstīšanas operācijas. |
Unlock() |
Atbrīvo slēdzeni rakstīšanai. Notiek panika, ja tas nebija aizslēgts rakstīšanai. |
RLock() |
Aizslēdz slēdzeni lasīšanai. Nebloķē citas lasīšanas operācijas. Bloķējas, ja ir aizslēgts rakstīšanai. |
RUnlock() |
Atbrīvo slēdzeni lasīšanai. Notiek panika, ja tas nebija aizslēgts lasīšanai. |
RLocker() |
Atgriež Locker, kas izmanto RLock un RUnlock. |
Piemērs, izmantojot sync.Mutex:
package main
import (
"fmt"
"sync"
"time"
)
var counter int
var mutex sync.Mutex
func increment() {
mutex.Lock() // Aizslēgt slēdzeni
counter++
fmt.Printf("Counter: %d\n", counter)
mutex.Unlock() // Atbrīvot slēdzeni
}
func main() {
for i := 0; i < 10; i++ {
go increment()
}
time.Sleep(time.Second) // Gaidīt, kamēr gorutīnas pabeigsies
}
Piemērs, izmantojot sync.RWMutex:
package main
import (
"fmt"
"sync"
"time"
)
var data string
var rwMutex sync.RWMutex
func readData() {
rwMutex.RLock() // Lasīšanai aizslēgt
fmt.Printf("Datu lasīšana: %s\n", data)
rwMutex.RUnlock() // Atbrīvot lasīšanu
}
func writeData(newData string) {
rwMutex.Lock() // Rakstīšanai aizslēgt
data = newData
fmt.Printf("Datu rakstīšana: %s\n", data)
rwMutex.Unlock() // Atbrīvot rakstīšanu
}
func main() {
go writeData("Hello")
time.Sleep(100 * time.Millisecond) // Gaidīt rakstīšanu
for i := 0; i < 5; i++ {
go readData() // Daudzas vienlaicīgas lasīšanas ir atļautas
}
time.Sleep(time.Second) // Gaidīt, kamēr gorutīnas pabeigsies
go writeData("World")
time.Sleep(100 * time.Millisecond)
go readData()
time.Sleep(time.Second)
}