Mutexes: Protecting Shared State
Mutex: umumiy holatni himoya qilish
WaitGroups darsida siz sync/atomicdan foydalanib sonlarni xavfsiz o'zgartirdingiz. Lekin atomic faqat oddiy sonlar bilan ishlaydi. Murakkabroq umumiy holatni (struct, map, bir nechta o'zaro bog'liq maydon) himoya qilish uchun `sync.Mutex` kerak — "mutual exclusion" (o'zaro chetlashtirish) qisqartmasi.
var mu sync.Mutex
mu.Lock()
counter++ // bu yerda faqat bitta goroutina bo'lishi mumkin
mu.Unlock()Lock() chaqirilganda, agar boshqa goroutina allaqachon qulflagan bo'lsa, joriy goroutina Unlock() chaqirilguncha kutadi. Bu — Errors Are Values darsidagi deferni tozalash uchun ishlatish andazasiga o'xshaydi: odatda mu.Lock()dan keyin darhol defer mu.Unlock() yozasiz, shunda funksiya qanday chiqib ketishidan qat'iy nazar qulf albatta ochiladi.
>_ Exercise
IncrementCounter(times int) int funksiyasini yozing. times marta alohida goroutina ishga tushiring — har biri sync.Mutex yordamida umumiy counterni bittaga oshiradi (mu.Lock(), counter++, mu.Unlock()). sync.WaitGroup bilan barchasi tugashini kutib, yakuniy counterni qaytaring.
Stuck? Reveal a hint to help you.
Key Takeaway
Key Takeaway:
sync.Mutex bir vaqtning o'zida faqat bitta goroutina himoyalangan kodni bajarishini kafolatlaydi. Lock()dan keyin darhol defer Unlock() yozish odatiy amaliyot — bu qulfni unutib qo'yishning oldini oladi.
NEXT UP
RWMutex: Many Readers, One Writer
$ go run main.go
Kodingizni ishga tushiring