Senior
Czy równoczesny dostęp do slice jest bezpieczny? Czy wystąpi warunek wyścigu, jeśli 4 goroutines zmieniają każdy swój unikalny indeks w slice?
sobes.tech AI
Odpowiedź od AI
W Go dostęp równoczesny do slice'a nie jest bezpieczny sam w sobie, ponieważ slice jest strukturą zawierającą wskaźnik na tablicę, długość i pojemność. Jednak jeśli 4 goroutines modyfikują każdy swój unikalny indeks slice'a i nie zmieniają długości ani pojemności slice'a, nie wystąpią warunki wyścigu, ponieważ każda goroutine pracuje z osobnym elementem.
Ważne jest, aby:
- Slice był wcześniej przydzielony o potrzebnym rozmiarze.
- Nie dochodziło do zmiany struktury slice'a (np. przez append) podczas zapisu.
Przykład:
s := make([]int, 4)
var wg sync.WaitGroup
wg.Add(4)
for i := 0; i < 4; i++ {
go func(i int) {
defer wg.Done()
s[i] = i * 10
}(i)
}
wg.Wait()
W tym przykładzie nie wystąpią warunki wyścigu, ponieważ każda goroutine zapisuje do unikalnego indeksu.
Jeśli jednak kilka goroutines może zmieniać długość slice'a lub pracować z tym samym indeksem — potrzebna jest synchronizacja.