RWMutex: Many Readers, One Writer
RWMutex: ko'p o'quvchi, bitta yozuvchi
Oddiy sync.Mutex juda qattiqqo'l: hatto ikkita goroutina faqat o'qimoqchi bo'lsa ham (hech narsani o'zgartirmasa), ular baribir navbat bilan kutishga majbur. sync.RWMutex bu holatni yaxshilaydi: bir nechta o'quvchi bir vaqtda o'qishi mumkin, lekin yozish uchun hamma o'quvchilar va boshqa yozuvchilar to'xtatilishi kerak.
var mu sync.RWMutex
mu.RLock() // "o'qish uchun qulf" — boshqa o'quvchilar bilan bo'lishiladi
defer mu.RUnlock()
mu.Lock() // "yozish uchun qulf" — hech kim bilan bo'lishilmaydi
defer mu.Unlock()Bu — Composite Types kursidagi struct metodlari g'oyasi bilan birlashadi: odatda RWMutexni struct ichiga joylab, Get metodini RLock, Set metodini Lock bilan himoyalaysiz. Natijada tashqi kod uchun oddiy, xavfsiz "do'kon" (store) hosil bo'ladi.
>_ Exercise
mu sync.RWMutex va data map[string]int maydonlariga ega SafeMap struct'ini yozing. Set(key string, value int) metodi Lock/Unlock bilan qiymatni yozadi; Get(key string) (int, bool) metodi RLock/RUnlock bilan qiymatni xavfsiz o'qib, map'dagi ikki qiymatli andaza (v, ok := data[key]) orqali qaytaradi. NewSafeMap() *SafeMap konstruktorini ham yozing (ichki map'ni make bilan ishga tushiring).
Stuck? Reveal a hint to help you.
Key Takeaway
Key Takeaway:
sync.RWMutex o'qish va yozishni ajratadi: ko'p o'quvchi parallel ishlashi mumkin, lekin yozuvchi doim yolg'iz ishlaydi. Ko'pincha o'qiladigan, kamdan-kam yoziladigan umumiy holat uchun bu oddiy Mutexdan ko'ra samaraliroq.
NEXT UP
Worker Pools: Bounded Concurrency
$ go run main.go
Kodingizni ishga tushiring