Sobes.tech
Middle

Go standart kitabxanası hansı növ mutexlər təqdim edir?

sobes.tech Süni İntellekt

AI-dan cavab

Go-nun standart kitabxanası sync paketində iki əsas mutex növü təqdim edir:

  • sync.Mutex: Əsas mutex, qarşılıqlı istisna təmin edir. İki vəziyyətdə ola bilər: bloklanmış və ya bloklanmamış. Yalnız bir goroutine eyni zamanda kilidi saxlaya bilər.
  • sync.RWMutex: Oxuma/yazma üçün mutex. Bir vaxtda çoxlu goroutinlərin məlumatı oxumasına imkan verir (RLock ilə), lakin yalnız birinin yazmasına (Lock ilə) icazə verir. Yazma bütün əməliyyatları (oxuma və yazma) bloklayır.

sync.Mutex-in əsas metodları:

Metod Təsviri
Lock() Mutex-i bloklayır. Əgər artıq bloklanıbsa, çağıran goroutine onun sərbəst buraxılana qədər bloklanır.
Unlock() Mutex-i sərbəst buraxır. Əgər mutex bloklanmayıbsa, panik yaranır.

sync.RWMutex-in əsas metodları:

Metod Təsviri
Lock() Yazma üçün mutex-i bloklayır. Bütün oxuma və yazma əməliyyatlarını bloklayır.
Unlock() Yazma üçün mutex-i sərbəst buraxır. Əgər bloklanmayıbsa, panik yaranır.
RLock() Oxuma üçün mutex-i bloklayır. Digər oxuma əməliyyatlarına mane olmur. Yazma kilidi varsa, gözləyir.
RUnlock() Oxuma üçün mutex-i sərbəst buraxır. Əgər bloklanmayıbsa, panik yaranır.
RLocker() RLockRUnlock istifadə edən Locker qaytarır.

sync.Mutex-in istifadəsinə nümunə:

package main

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

var counter int
var mutex sync.Mutex

func increment() {
	mutex.Lock() // Mutex-i bloklayır
	counter++
	fmt.Printf("Counter: %d\n", counter)
	mutex.Unlock() // Mutex-i sərbəst buraxır
}

func main() {
	for i := 0; i < 10; i++ {
		go increment()
	}
	time.Sleep(time.Second) // Goroutinların bitməsini gözləyir
}

sync.RWMutex-in istifadəsinə nümunə:

package main

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

var data string
var rwMutex sync.RWMutex

func readData() {
	rwMutex.RLock() // Oxuma üçün bloklayır
	fmt.Printf("Məlumat oxuma: %s\n", data)
	rwMutex.RUnlock() // Oxuma üçün açır
}

func writeData(newData string) {
	rwMutex.Lock() // Yazma üçün bloklayır
	data = newData
	fmt.Printf("Məlumat yazma: %s\n", data)
	rwMutex.Unlock() // Yazma üçün açır
}

func main() {
	go writeData("Salam")
	time.Sleep(100 * time.Millisecond) // Yazma üçün vaxt verir

	for i := 0; i < 5; i++ {
		go readData() // Birdən çox oxuma icazə verilir
	}

	time.Sleep(time.Second) // Goroutinların bitməsini gözləyir
	go writeData("Dünya")
	time.Sleep(100 * time.Millisecond)
	go readData()

	time.Sleep(time.Second) // Bitməsini gözləyir
}