Sobes.tech
Senior

მიუტექსის გარეშე სლაისი შეავსეთ, რათა მასში იყოს ყველა 1000 ელემენტი.

sobes.tech AI

პასუხი AI-სგან

მიუტექსის გამოყენების გარეშე შეგიძლიათ პარალელურად შეავსოთ 1000 ელემენტიანი სლაისი, თუ წინასწარ გამოყოფთ საჭირო ზომის სლაის და ინდექსებს შორის განაწილებთ goroutine-ების შორის ისე, რომ თითოეული დაწერს უნიკალურ ნაწილში სლაის. ამგვარად, მონაცემთა შეჯახება არ იქნება, რადგან თითოეული ელემენტი მხოლოდ ერთი 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("სლაისის სიგრძე:", len(slice))
	fmt.Println("პირველი 10 ელემენტი:", slice[:10])
}

აქ, თითოეული goroutine წერს თავის ნაწილში სლაის, ამიტომ mutex-ის საჭიროება არ არის.