Sobes.tech
Junior — Middle

Czy można uznać strukturę z dwoma polami za bezpieczną do użycia w warunkach wielowątkowych?

sobes.tech AI

Odpowiedź od AI

Struktura z dwoma polami w Go sama w sobie nie jest bezpieczna dla wątków. Bez dodatkowej synchronizacji dostęp do pól struktury z wielu gorutyn może prowadzić do warunków wyścigu.

Jeśli pola struktury nie zmieniają się po inicjalizacji (czyli struktura jest niemutowalna), to jest bezpieczna do odczytu z wielu wątków.

Jeśli jednak pola mogą się zmieniać, to dla zapewnienia bezpieczeństwa należy używać mechanizmów synchronizacji, takich jak sync.Mutex lub sync.RWMutex.

Przykład z mutexem:

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
}

W ten sposób sama struktura nie gwarantuje bezpieczeństwa, musi być specjalnie chroniona.