Sobes.tech
Middle

Ի՞նչ է տարբերությունը RW Mutex-ի և սովորական մյուտեքսի միջև։

sobes.tech AI

Պատասխան AI-ից

sync.RWMutex թույլ է տալիս միաժամանակ մի քանի գորուտինների ընթերցել տվյալները, բայց միայն մեկ գորուտին կարող է գրել տվյալները։ sync.Mutex արգելափակում է մուտքը ցանկացած այլ գորուտինին, որը փորձում է ստանալ փակագծի (կարդալ կամ գրել), մինչեւ առաջին գորուտին ազատի փակագիծը։

  • sync.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()
Արդյունավետություն Պարզ, հնարավոր է՝ ավելի դանդաղ հաճախակի կարդալու դեպքում Կրկնվող, հնարավոր է՝ ավելի արագ հաճախակի կարդալու և հազվադեպ գրելու դեպքում