Mutex: Protecting Shared Data
Mutex: umumiy ma'lumotni himoya qilish
WaitGroup darsida har bir goroutina slice'ning o'z indeksiga yozgani uchun poyga sharoiti yo'q edi. Lekin ba'zida barcha goroutinalar bitta umumiy qiymatni (masalan, hisoblagichni) o'zgartirishi kerak bo'ladi. Oddiy counter++ bu yerda ishlamaydi — bir nechta goroutina bir vaqtda o'qib-yozishi mumkin va yangilanishlar yo'qolib qoladi.
Yechim — `sync.Mutex` ("mutual exclusion" — o'zaro chetlashtirish): bir vaqtning o'zida faqat bitta goroutina himoyalangan kodni bajarishini kafolatlaydigan qulf.
var mu sync.Mutex
mu.Lock()
counter++ // bu yerda faqat bitta goroutina bo'lishi mumkin
mu.Unlock()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
Channels: Communication Between Goroutines
$ go run main.go
Kodingizni ishga tushiring