Sobes.tech
Senior

Լրացրեք սլայսը առանց մյուտեքսի, որպեսզի այն ունենա բոլոր 1000 տարրերը։

sobes.tech AI

Պատասխան AI-ից

Մուտեքս օգտագործելու առանց կարող եք միաժամանակ լցնել 1000 տարրեր պարունակող slice-ը, եթե նախապես հատկացնեք անհրաժեշտ չափի slice և բաժանեք ինդեքսները goroutine-ների միջև այնպես, որ յուրաքանչյուրը գրի միայն յուրահատուկ հատվածում slice-ի։ Այսպիսով, տվյալների մրցակցություն չի լինի, քանի որ յուրաքանչյուր տարր միայն մեկ goroutine-ի կողմից է գրանցվում։

Օրինակ՝

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 // վերջին աշխատողը կարող է վերցնել մնացորդը
		}

		wg.Add(1)
		go func(s, e int) {
			defer wg.Done()
			for i := s; i < e; i++ {
				slice[i] = i * 2 // օրինակ լրացում
			}
		}(start, end)
	}

	wg.Wait()

	fmt.Println("Slice-ի երկարությունը:", len(slice))
	fmt.Println("Առաջին 10 տարրերը:", slice[:10])
}

Այստեղ, յուրաքանչյուր goroutine գրում է իր հատվածում slice-ի, ուստի mutex-ը անհրաժեշտ չէ։