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