Sobes.tech
Middle

RW Mutex ilə adi mutex arasındakı fərq nədir?

sobes.tech Süni İntellekt

AI-dan cavab

sync.RWMutex çox sayda goroutine-un eyni zamanda məlumatları oxumasına imkan verir, lakin yalnız bir goroutine məlumatları yaza bilər. sync.Mutex digər goroutine-lərin kilidi əldə etməsini bloklayır (oxuma və ya yazma üçün), ilk goroutine kilidi azad edənə qədər.

  • sync.Mutex: Eksklüziv kilid. Ya kilidlənmişdir, ya da deyil. Yalnız bir goroutine hər zaman mutex-i saxlaya bilər. Tez-tez və ya oxşar müddətə malik oxuma və yazma əməliyyatları üçün uyğundur.

    // Mutex istifadə nümunəsi
    var mu sync.Mutex
    var counter int
    
    func increment() {
        mu.Lock()
        counter++
        mu.Unlock()
    }
    
  • sync.RWMutex: Oxuma və yazma üçün kilid. Bir çox goroutine-ın eyni zamanda oxumağa malik olmasına imkan verir, lakin yazma üçün kilid eksklüzivdir. Yazma üçün kilid tutan goroutine digər yazma və oxuma əməliyyatlarını bloklayır. Goroutine-lər oxuma üçün kilid tutanda, yazma əməliyyatlarını bloklayır, digər oxuma əməliyyatlarını isə bloklamır. Oxuma əməliyyatları çox daha tez-tez baş verdiyindən uyğundur.

    // RWMutex istifadə nümunəsi
    var rwmu sync.RWMutex
    var data map[string]string = make(map[string]string)
    
    func readData(key string) string {
        rwmu.RLock() // Oxuma üçün kilid alınır
        value := data[key]
        rwmu.RUnlock() // Oxuma üçün kilid azad edilir
        return value
    }
    
    func writeData(key, value string) {
        rwmu.Lock() // Yazma üçün kilid alınır
        data[key] = value
        rwmu.Unlock() // Yazma üçün kilid azad edilir
    }
    

Əsas fərqlər aşağıdakı cədvəldə ümumiləşdirilə bilər:

Xüsusiyyət sync.Mutex sync.RWMutex
Kilit növü Eksklüziv (oxuma/yazma) Paylaşılan (oxuma) + eksklüziv (yazma)
Eyni zamanda giriş Bir goroutine Bir çox goroutine oxuma, bir goroutine yazma
Oxuma üçün kilid metodu Lock() RLock()
Yazma üçün kilid metodu Lock() Lock()
Oxuma üçün kilid azad etmə Unlock() RUnlock()
Yazma üçün kilid azad etmə Unlock() Unlock()
Performans Daha sadə, tez-tez oxuma zamanı yavaş ola bilər Daha mürəkkəb, tez-tez oxuma və nadir yazma zamanı daha sürətli ola bilər