Sobes.tech
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)
}

Атомарлы операцияларды пайдалану — басқа күрделі операцияларсыз санақты тек арттыру керек болғанда тиімді, себебі ол өнімділікке әсер етпейді.