Senior
Vyplňte řez s prvky bez mutexu, aby obsahoval všech 1000 prvků.
sobes.tech AI
Odpověď od AI
Bez použití mutexu lze paralelně naplnit slice o 1000 prvcích tak, že předem alokujete slice požadované velikosti a rozdělujete indexy mezi gorutiny tak, aby každá zapisovala do unikátní části slice. Tím se zabrání datovým závodům, protože každý prvek je zapisován pouze jednou gorutinou.
Příklad:
package main
import (
"fmt"
"sync"
)
func main() {
size := 1000
slice := make([]int, size)
var wg sync.WaitGroup
workers := 10
chunkSize := size / workers
for w := 0; w < workers; w++ {
start := w * chunkSize
end := start + chunkSize
if w == workers-1 {
end = size // poslední pracovník může vzít zbytek
}
wg.Add(1)
go func(s, e int) {
defer wg.Done()
for i := s; i < e; i++ {
slice[i] = i * 2 // příklad naplnění
}
}(start, end)
}
wg.Wait()
fmt.Println("Délka slice:", len(slice))
fmt.Println("Prvních 10 prvků:", slice[:10])
}
Zde každý goroutine zapisuje do své části slice, takže mutex není potřeba.