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