Sobes.tech
Junior — Middle

Կարո՞ղ է համարվել երկու դաշտով կառուցվածքը անվտանգ բազմատողային պայմաններում օգտագործելու համար։

sobes.tech AI

Պատասխան AI-ից

Go-ում երկու դաշտերով կառուցվածքը ինքնին անվտանգ չէ հոսքերի համար: Ավելացվող սինխրոնիզացիայի բացակայության դեպքում, կառուցվածքի դաշտերին միաժամանակ մի քանի գորուտիններից մուտք գործելը կարող է հանգեցնել մրցակցության պայմանների:

Եթե կառուցվածքի դաշտերը փոփոխվում են միայն սկզբնականից հետո (այսինքն՝ կառուցվածքը անփոփոխ է), ապա այն անվտանգ է միաժամանակյա ընթերցման համար:

Եթե դաշտերը կարող են փոփոխվել, ապա անվտանգության ապահովման համար անհրաժեշտ է օգտագործել սինխրոնիզացիայի մեխանիզմներ, ինչպիսիք են sync.Mutex կամ sync.RWMutex:

Օրինակ mutex-ով:

import "sync"

type SafeStruct struct {
    mu sync.Mutex
    field1 int
    field2 string
}

func (s *SafeStruct) Set(field1 int, field2 string) {
    s.mu.Lock()
    defer s.mu.Unlock()
    s.field1 = field1
    s.field2 = field2
}

func (s *SafeStruct) Get() (int, string) {
    s.mu.Lock()
    defer s.mu.Unlock()
    return s.field1, s.field2
}

Այսպիսով, կառուցվածքը ինքնին ապահով չէ, այն պետք է հատուկ պաշտպանվի։