Sobes.tech
Junior — Middle

Kas võib pidada kahte välja omavat struktuuri ohutuks mitme niidiga tingimustes kasutamiseks?

sobes.tech AI

Vastus AI-lt

Struktuur kahe väljariga Go keeles ei ole iseenesest voolude turvaline. Täiendava sünkroneerimise puudumisel võib juurdepääs struktuuri väljadele mitmest gorutist põhjustada võistlusolukordi.

Kui struktuuri väljad ei muutu pärast initsialiseerimist (st. struktuur on muutumatu), siis on see ohutu lugeda mitmest lõimest.

Kui väljad võivad muutuda, siis turvalisuse tagamiseks tuleb kasutada sünkroneerimismehhanisme, näiteks sync.Mutex või sync.RWMutex.

Näide mutexiga:

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
}

Seega, struktuur ise ei taga turvalisust, seda tuleb spetsiaalselt kaitsta.