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