Middle
Ի՞նչ տեսակի մյուտեքսներ է տրամադրում Go-ի ստանդարտ գրադարանը։
sobes.tech AI
Պատասխան AI-ից
Ստանդարտ գրադարանն Go-ի sync փաթեթում առաջարկում է երկու հիմնական տեսակի մուտեքսներ.
sync.Mutex: Հիմնական մուտեքս, որը ապահովում է փոխադարձ բացառություն: Կարող է լինել երկու վիճակում՝ փակ կամ բաց: Միաժամանակ միայն մեկ գորուտին կարող է պահել փակումը:sync.RWMutex: Կարդալու/գրելու մուտեքս: Ինքը թույլ է տալիս միաժամանակ մի քանի գորուտին կարդալ տվյալները (RLock-ով), բայց միայն մեկին գրել (Lock-ով): Գրելու գործողությունը փակ է դարձնում բոլոր մյուս գործողությունները՝ ինչպես կարդալը, այնպես էլ գրելը:
sync.Mutex-ի հիմնական մեթոդները:
| մեթոդ | նկարագրություն |
|---|---|
Lock() |
Փակել մուտեքսը: Եթե արդեն փակ է, կանչող գորուտին սպասում է բացմանը: |
Unlock() |
Բացել մուտեքսը: Եթե մուտեքսը չէր փակված, առաջանում է panic: |
sync.RWMutex-ի հիմնական մեթոդները:
| մեթոդ | նկարագրություն |
|---|---|
Lock() |
Փակել մուտեքսը գրելու համար: Բլոկավորում է բոլոր կարդալու և գրելու գործողությունները: |
Unlock() |
Բացել մուտեքսը գրելու համար: Եթե չէր փակված, առաջանում է panic: |
RLock() |
Փակել մուտեքսը կարդալու համար: Չի բլոկավորում մյուս կարդալու գործողությունները: Բլոկավորվում է, եթե գրելու մուտեքսը փակ է: |
RUnlock() |
Բացել մուտեքսը կարդալու համար: Եթե չէր փակված, առաջանում է panic: |
RLocker() |
Վերադարձնում է Locker, որը օգտագործում է RLock և RUnlock-ը: |
Օրինակ sync.Mutex-ի օգտագործման:
package main
import (
"fmt"
"sync"
"time"
)
var counter int
var mutex sync.Mutex
func increment() {
mutex.Lock() // Փակել մուտեքսը
counter++
fmt.Printf("Counter: %d\n", counter)
mutex.Unlock() // Բացել մուտեքսը
}
func main() {
for i := 0; i < 10; i++ {
go increment()
}
time.Sleep(time.Second) // Կատարման ավարտին սպասել
}
Օրինակ sync.RWMutex-ի օգտագործման:
package main
import (
"fmt"
"sync"
"time"
)
var data string
var rwMutex sync.RWMutex
func readData() {
rwMutex.RLock() // Կարդալու համար փակել
fmt.Printf("Կարդում տվյալները: %s\n", data)
rwMutex.RUnlock() // Բացել կարդալու համար
}
func writeData(newData string) {
rwMutex.Lock() // Գրելու համար փակել
data = newData
fmt.Printf("Գրելու տվյալները: %s\n", data)
rwMutex.Unlock() // Բացել գրելու համար
}
func main() {
go writeData("Hello")
time.Sleep(100 * time.Millisecond) // Կատարման ավարտին սպասել
for i := 0; i < 5; i++ {
go readData() // Մեծ քանակությամբ միաժամանակյա կարդալու գործողություններ թույլատրվում են
}
time.Sleep(time.Second) // Կատարման ավարտին սպասել
go writeData("World")
time.Sleep(100 * time.Millisecond)
go readData()
time.Sleep(time.Second)
}