Sobes.tech
Middle+

Konkurrentlik (Concurrency) kontekstində slices istifadə etmək nə qədər təhlükəsizdir?

sobes.tech Süni İntellekt

AI-dan cavab

Concurrency kontekstində əlavə sinxronizasiya mexanizmləri olmadan dilimlərin təhlükəsiz deyil. Eyni zamanda oxuma və yazma və ya eyni yaddaş sahəsinə (slice-in əsas massivinə) iki eyni zamanda yazma girişi məlumat yarışına (data race) səbəb olur.

Təhlükəsizliksizliyin səbəbləri:

  1. Əsas massivdə dəyişiklik: Slice, əsas massivə baxışdır. Elementlərin əlavə olunması (append), xüsusən də cari tutumu aşdıqda, yeni massivə re-yerləşdirmə və məlumatların köçürülməsinə səbəb ola bilər. Bu zaman başqa bir goroutine köhnə və ya yeni əsas massivdə oxuma və ya yazma cəhd edərsə, məlumat yarışı baş verir.
  2. Slice başlığının dəyişdirilməsi: Slice başlığı (göstərici, uzunluq və tutumu saxlayan struktur) append kimi əməliyyatlar zamanı dəyişdirilə bilər. Bu başlıq üzərində eyni zamanda oxuma və yazma qeyri-müəyyən davranışlara səbəb olur.

Təhlükəsizliyi təmin edən mexanizmlər:

  • sync.Mutex / sync.RWMutex: Hər oxuma və ya yazma əməliyyatından əvvəl slice-ə giriş bloklanır. sync.RWMutex çox oxuma və az yazma olan scenarilərdə üstün tutulur.

    import "sync"
    
    type SafeSlice struct {
        mu    sync.RWMutex
        items []int
    }
    
    func (s *SafeSlice) Append(item int) {
        s.mu.Lock() // Yazma üçün bloklama
        defer s.mu.Unlock()
        s.items = append(s.items, item)
    }
    
    func (s *SafeSlice) Get(index int) (int, bool) {
        s.mu.RLock() // Oxuma üçün bloklama
        defer s.mu.RUnlock()
        if index < 0 || index >= len(s.items) {
            return 0, false
        }
        return s.items[index], true
    }
    
  • Kanal (Channels): Məlumatların kanal vasitəsilə mülkiyyətinin ötürülməsi. Bir goroutine məlumat yazar, digər isə onları kanaldan oxuyar. Bu, axın emalı scenariləri üçün uyğundur.

    // Elementlərin ötürülməsi üçün kanal istifadəsi nümunəsi
    // bir goroutine istehsal edir, digər isə istehlak edir
    
  • sync.Map: Əgər slice açarların dəyərlərə xəritələşdirilməsi üçün istifadə olunursa və ya ardıcıllıq önəmli deyilsə, lakin konkurrent təhlükəsizlik vacibdirsə, uyğundur.

Nəticə: Konkurrent scenarilərdə slice istifadəsi, məlumat yarışlarını qarşısını almaq üçün açıq şəkildə sinxronizasiya idarəsini tələb edir. Bir neçə goroutine tərəfindən eyni zamanda slice-ə sadə giriş təhlükəsiz deyil.