Middle
Go standart kutubxonasi qanday turdagi mutexlarni taqdim etadi?
sobes.tech AI
AIdan javob
Go standart kutubxonasi sync paketida ikkita asosiy mutex turini taqdim etadi:
sync.Mutex: Asosiy mutex bo‘lib, u o‘zaro chiqarishni ta’minlaydi. U ikki holatda bo‘lishi mumkin: bloklangan yoki bloklanmagan. Faqat bir goroutine bloklashni ushlab turishi mumkin.sync.RWMutex: O‘qish/yozish uchun mutex. Bir vaqtning o‘zida ko‘p goroutinlar ma’lumotni o‘qishi mumkin (RLockyordamida), lekin faqat bittasi yozishi mumkin (Lockyordamida). Yozish barcha operatsiyalarni (o‘qish va yozish) bloklaydi.
sync.Mutex ning asosiy metodlari:
| Metod | Tavsifi |
|---|---|
Lock() |
Mutexni bloklaydi. Agar u allaqachon bloklangan bo‘lsa, chaqiruvchi goroutine uni bo‘shatguncha bloklanadi. |
Unlock() |
Mutexni ochadi. Agar mutex bloklanmagan bo‘lsa, panic yuzaga keladi. |
sync.RWMutex ning asosiy metodlari:
| Metod | Tavsifi |
|---|---|
Lock() |
Yozish uchun mutexni bloklaydi. Barcha o‘qish va yozish operatsiyalarini bloklaydi. |
Unlock() |
Yozish uchun mutexni ochadi. Agar bloklangan bo‘lmasa, panic yuzaga keladi. |
RLock() |
O‘qish uchun mutexni bloklaydi. Boshqa o‘qish operatsiyalariga to‘sqinlik qilmaydi. Yozish bloklansa, kutadi. |
RUnlock() |
O‘qish uchun mutexni ochadi. Agar bloklanmagan bo‘lsa, panic yuzaga keladi. |
RLocker() |
RLock va RUnlock ishlatadigan Locker ni qaytaradi. |
sync.Mutex dan foydalanish misoli:
package main
import (
"fmt"
"sync"
"time"
)
var counter int
var mutex sync.Mutex
func increment() {
mutex.Lock() // Mutexni bloklaydi
counter++
fmt.Printf("Counter: %d\n", counter)
mutex.Unlock() // Mutexni ochadi
}
func main() {
for i := 0; i < 10; i++ {
go increment()
}
time.Sleep(time.Second) // Goroutinlar tugashini kutadi
}
sync.RWMutex dan foydalanish misoli:
package main
import (
"fmt"
"sync"
"time"
)
var data string
var rwMutex sync.RWMutex
func readData() {
rwMutex.RLock() // O‘qish uchun bloklaydi
fmt.Printf("Ma’lumotlarni o‘qish: %s\n", data)
rwMutex.RUnlock() // O‘qish uchun ochadi
}
func writeData(newData string) {
rwMutex.Lock() // Yozish uchun bloklaydi
data = newData
fmt.Printf("Ma’lumot yozish: %s\n", data)
rwMutex.Unlock() // Yozish uchun ochadi
}
func main() {
go writeData("Salom")
time.Sleep(100 * time.Millisecond) // Yozishni kutadi
for i := 0; i < 5; i++ {
go readData() // Bir vaqtning o‘zida ko‘p o‘qish mumkin
}
time.Sleep(time.Second) // Goroutinlar tugashini kutadi
go writeData("Dunyo")
time.Sleep(100 * time.Millisecond)
go readData()
time.Sleep(time.Second)
}