Sobes.tech
Middle+

Program çalıştırıldığında ne gösterilir: func main() { counter := make([]int, 0, 1000) var wg sync.WaitGroup for i := 0; i < 1000; i++ { wg.Add(1) go func() { defer wg.Done() counter = append(counter, i) time.Sleep(10 * time.Millisecond) // İşlem simülasyonu }() } wg.Wait() fmt.Println(len(counter)) }

sobes.tech yapay zeka

AI'dan gelen yanıt

Program, counter dilimine birkaç goroutine tarafından senkronizasyon olmadan yazılırken veri yarışı içeriyor. Bu, tahmin edilemeyen davranışlara yol açar.

Neler oluyor:

  • Uzunluğu 0 ve kapasitesi 1000 olan bir counter dilimi oluşturulur.
  • 1000 goroutine başlatılır, her biri i değerini dilime eklemeye çalışır.
  • append işlemi çoklu iş parçacığı güvenli değildir, birkaç goroutine aynı anda dilimi değiştirir.
  • Veri yarışı nedeniyle veri kaybı, dilim bozulması veya panik olabilir.

Sonuçta:

  • len(counter) değeri 1000’den küçük olabilir, çünkü bazı girişler kaybolabilir.
  • Bir panik veya yanlış çıktı olabilir.

Doğru yaklaşım, dilime erişimi senkronize etmek için mutex veya kanal kullanmaktır:

var mu sync.Mutex

for i := 0; i < 1000; i++ {
    wg.Add(1)
    go func(val int) {
        defer wg.Done()
        mu.Lock()
        counter = append(counter, val)
        mu.Unlock()
        time.Sleep(10 * zaman.Millisecond)
    }(i)
}

Veya çoklu iş parçacığı güvenli veri yapıları kullanın.