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