GoDasturchi
Mutexes: Protecting Shared State

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.

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

Hints (0/3)

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

OUTPUT

$ go run main.go
Kodingizni ishga tushiring

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.

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

Hints (0/3)

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