Sobes.tech
Senior

L'accès concurrentiel à une tranche est-il sûr ? Y aura-t-il une condition de course si 4 goroutines modifient chacune leur index unique de la tranche ?

sobes.tech IA

Réponse de l'IA

En Go, l'accès concurrentiel à une tranche n'est pas sûr en soi, car une tranche est une structure contenant un pointeur vers un tableau, une longueur et une capacité. Cependant, si 4 goroutines modifient chacune leur index unique de la tranche et ne modifient pas la longueur ou la capacité, il n'y aura pas de conditions de course, car chaque goroutine travaille avec un élément séparé.

Il est important que :

  • La tranche soit préallouée à la taille nécessaire.
  • La structure de la tranche ne soit pas modifiée (par exemple, avec append) pendant l'écriture.

Exemple :

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()

Dans cet exemple, il n'y aura pas de conditions de course, car chaque goroutine écrit dans un index unique.

Si plusieurs goroutines peuvent changer la longueur du slice ou travailler avec le même index, une synchronisation est nécessaire.