Sobes.tech
Middle

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()
Өндүрүмдүүлүк Жөнөкөй, көп окулушу учурда жайыраак болушу мүмкүн Кыйын, көп окулушу жана сейрек жазуу учурда тезирээк болушу мүмкүн