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 (RLockilə), lakin yalnız birinin yazmasına (Lockilə) 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() |
RLock və RUnlock 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
}