GoDasturchi
RWMutex: Many Readers, One Writer

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.

example.go
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.

Hints (0/4)

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

OUTPUT

$ go run main.go
Kodingizni ishga tushiring

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.

example.go
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.

Hints (0/4)

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