Middle
Кадом mutex-ро истифода мебаред, барои таъмини амният дар кор бо харитахо дар Go?
sobes.tech AI
Ҷавоб аз AI
เพื่อให้แน่ใจในความปลอดภัยเมื่อทำงานกับการเข้าถึงข้อมูลแบบไม่แข่งขันกัน รวมถึงแผนที่ (map) ใน Go จะใช้ mutex จากแพ็กเกจ sync
sync.Mutex: mutex พื้นฐานสำหรับการยกเว้นซึ่งกันและกัน ใช้สำหรับบล็อกและปลดล็อกส่วนของโค้ดที่มีการอ่านหรือเขียนในแผนที่sync.RWMutex: mutex ที่มีการเข้าถึงแบบแบ่งปัน (อ่าน) และแบบเฉพาะ (เขียน) ช่วยให้หลาย goroutine สามารถอ่านจากแผนที่พร้อมกันได้ แต่เขียนได้เพียงหนึ่งเดียว เหมาะสำหรับสถานการณ์ที่การอ่านมีจำนวนมากกว่าการเขียน
ตัวเลือกที่นิยมสำหรับการทำงานพร้อมกันอย่างปลอดภัยกับแผนที่คือ sync.RWMutex เนื่องจากให้ประสิทธิภาพที่ดีกว่าเมื่อมีการอ่านพร้อมกันหลายๆ รายการ
ตัวอย่างการใช้งาน sync.RWMutex:
import (
"sync"
)
type SafeMap struct {
mu sync.RWMutex
m map[string]int
}
func NewSafeMap() *SafeMap {
return &SafeMap{
m: make(map[string]int),
}
}
func (sm *SafeMap) Set(key string, value int) {
sm.mu.Lock() // ล็อกเพื่อเขียน
defer sm.mu.Unlock()
sm.m[key] = value
}
func (sm *SafeMap) Get(key string) (int, bool) {
sm.mu.RLock() // ล็อกเพื่ออ่าน
defer sm.mu.RUnlock()
value, ok := sm.m[key]
return value, ok
}
ยังมีชนิดพิเศษ sync.Map ซึ่งได้รับการปรับให้เหมาะสมสำหรับการใช้งานพร้อมกันโดยไม่ต้องล็อก mutex อย่างชัดเจนในกรณีส่วนใหญ่ แต่มีข้อจำกัดบางประการและ API ที่แตกต่างกัน อย่างไรก็ตาม หากต้องการการควบคุมล็อกที่ยืดหยุ่นมากขึ้นหรือสถานการณ์การเข้าถึงเฉพาะ การใช้ sync.RWMutex บน map มาตรฐานเป็นแนวปฏิบัติที่นิยมกัน