Sobes.tech
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 มาตรฐานเป็นแนวปฏิบัติที่นิยมกัน