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