RW Mutex менен жөнөкөй mutexтин айырмасы эмнеде?
sobes.tech AI
AIден жооп
sync.RWMutex бир нече горутиндердин бир мезгилде маалыматты окушун камсыздайт, бирок бир гана горутина маалыматты жазышы мүмкүн. sync.Mutex башка бардык горутиндердин киришин блоктойт, эгер ал зымга ээ болууга аракет кылса (окуу же жазуу), биринчи горутина зымды бошотконго чейин.
-
sync.Mutex: Эксклюзивдүү зым. Анын ичинде зым бар же жок. Бир гана горутина кез келген учурда мютексин кармай алат. Окулушу жана жазылышы көп же бирдей узактыкта болуучу операциялар үчүн ылайыктуу.// Mutex колдонуу мисалы var mu sync.Mutex var counter int func increment() { mu.Lock() counter++ mu.Unlock() } -
sync.RWMutex: Окулушу жана жазылышы үчүн зым. Бир нече горутиндер бир мезгилде маалыматты окуй алат, бирок жазуу үчүн зым эксклюзивдүү. Жазуу зымын кармаган горутина башка жазуу жана окулушу аракеттерин блоктойт. Окулушу зымын кармаган горутиндер жазуу аракеттерин блоктойт, бирок башка окулушу аракеттерин эмес. Окулушу аракеттери жазууга караганда кыйла көп болсо, ылайыктуу.// RWMutex колдонуу мисалы var rwmu sync.RWMutex var data map[string]string = make(map[string]string) func readData(key string) string { rwmu.RLock() // Окулушу үчүн зымды алуу value := data[key] rwmu.RUnlock() // Зымды бошотуу return value } func writeData(key, value string) { rwmu.Lock() // Жазуу үчүн зымды алуу data[key] = value rwmu.Unlock() // Зымды бошотуу }
Негизги айырмачылыктар таблицада кыскача берилет:
| Өзгөчөлүк | sync.Mutex |
sync.RWMutex |
|---|---|---|
| Зым түрү | Эксклюзивдүү (окуу/жазуу) | Биргелешкен (окуу) + эксклюзивдүү (жазуу) |
| Бир мезгилде жеткиликтүүлүк | Бир горутина | Бир нече горутиндер окулушу үчүн, бирөө жазуу үчүн |
| Окулушу үчүн зымдын методу | Lock() |
RLock() |
| Жазуу үчүн зымдын методу | Lock() |
Lock() |
| Окулушу үчүн зымды бошотуу | Unlock() |
RUnlock() |
| Жазуу үчүн зымды бошотуу | Unlock() |
Unlock() |
| Өндүрүмдүүлүк | Жөнөкөй, көп окулушу учурда жайыраак болушу мүмкүн | Кыйын, көп окулушу жана сейрек жазуу учурда тезирээк болушу мүмкүн |