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() |
RLock жана RUnlock колдонгон Locker кайтарат. |
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)
}
```}}}}}the content.{