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()
წარმოება მარტივი, შესაძლოა ნელი იყოს ხშირი წაკითხვით რთული, შესაძლოა სწრაფი იყოს ხშირი წაკითხვით და იშვიათი დაწერით