Sobes.tech
Middle — Middle+

Çok iş parçacıklı bir ortamda dilimlerle çalışırken iş parçacığı güvenliğini sağlamak için hangi yaklaşımlar kullanılabilir?

sobes.tech yapay zeka

AI'dan gelen yanıt

Go'da dilimler (slices) varsayılan olarak eşzamanlı erişim için güvenli değildir, bu nedenle çok iş parçacıklı ortamda çalışırken senkronizasyon uygulanması gerekir.

Ana yaklaşımlar:

  1. Mutex (sync.Mutex) — en yaygın yöntem. Okuma ve yazma işlemlerini mutex ile sarmalayarak yarış koşullarını önleyin.
var mu sync.Mutex
var s []int

func appendValue(v int) {
    mu.Lock()
    s = append(s, v)
    mu.Unlock()
}

func readSlice() []int {
    mu.Lock()
    defer mu.Unlock()
    return append([]int(nil), s...) // kopya dilim
}
  1. sync.RWMutex — çok sayıda okuma ve az sayıda yazma işlemi varsa, performansı artırmak için kullanılabilir.

  2. Dilim kopyalama — yarış koşullarını önlemek için dilim kopyalarıyla çalışılabilir, ancak bu her zaman verimli değildir.

  3. Kanallar (channels) — dilime erişimi, kanal aracılığıyla komutlar alan ve dilimi değiştiren bir yönetici goroutine ile organize edilebilir, böylece sıralı erişim sağlanır.

type command struct {
    op   string
    val  int
    resp chan []int
}

func sliceManager(cmds chan command) {
    var s []int
    for cmd := range cmds {
        switch cmd.op {
        case "append":
            s = append(s, cmd.val)
        case "read":
            cmd.resp <- append([]int(nil), s...)
        }
    }
}

Yaklaşım seçimi, performans ve kodun karmaşıklık gereksinimlerine bağlıdır.