Junior — Middle
Go тілінде құрылым ішіндегі санағышты қауіпсіз түрде көбейту қалай жүзеге асырылады?
sobes.tech AI
AI-дан жауап
Go тілінде бірнеше ағындармен жұмыс істеген кезде құрылым ішіндегі шақыру санын қауіпсіз түрде арттыру үшін әдетте sync пакетін пайдаланады.
Ең қарапайым әдіс — sync.Mutex пайдаланып, санақ өрісіне қол жеткізуді блоктау:
import "sync"
type Counter struct {
mu sync.Mutex
count int
}
func (c *Counter) Increment() {
c.mu.Lock()
defer c.mu.Unlock()
c.count++
}
func (c *Counter) Value() int {
c.mu.Lock()
defer c.mu.Unlock()
return c.count
}
Басқа әдіс — sync/atomic пакетінен атомарлы операцияларды пайдалану, олар айнымалыны ашық блоктамай-ақ арттыруға мүмкіндік береді:
import (
"sync/atomic"
)
type Counter struct {
count int64
}
func (c *Counter) Increment() {
atomic.AddInt64(&c.count, 1)
}
func (c *Counter) Value() int64 {
return atomic.LoadInt64(&c.count)
}
Атомарлы операцияларды пайдалану — басқа күрделі операцияларсыз санақты тек арттыру керек болғанда тиімді, себебі ол өнімділікке әсер етпейді.