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