Sobes.tech
Middle+

Fərqli gorutinlərə slices ötürmək nə qədər təhlükəsizdir?

sobes.tech Süni İntellekt

AI-dan cavab

Fərqli gorutinlara slice-ləri birbaşa ötürmək təhlükəsiz deyil əgər gorutinlər onları eyni zamanda dəyişdirərsə və ya slice ötürüləndən sonra (başlıq nüsxəsi ilə) başqa bir gorutinə dəyişdirilərsə.

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

  • Ümumi əsas massiv: Slice-lər başlıqlardır (əsas massivə göstərici, uzunluq, tutum) və ümumi əsas massivə işarə edir.
  • Yarış vəziyyəti (Race Condition): Eyni elementə eyni zamanda yazmaq və ya onun ölçüsünü müxtəlif gorutinlərdən dəyişdirmək yarış vəziyyətlərinə, proqnozlaşdırılmayan nəticələrə və səhvlərə səbəb olacaq.

Slice-lərlə gorutinlarda təhlükəsiz işləmə üsulları:

  1. Slice nüsxəsini ötürmək: Slice-in tam nüsxəsini yaradıb ötürün. Bu təhlükəsizdir, çünki gorutinlər ayrılmış məlumatlarla işləyir.

    // tam slice nüsxəsi yaratmaq
    newSlice := make([]int, len(originalSlice))
    copy(newSlice, originalSlice)
    
  2. Kanalardan istifadə: Slice elementlərini və ya bütün slice-i kanallar vasitəsilə ötürün. Kanallar məlumatların sinxronizasiyasını və izoləsini təmin edir.

    // elementləri kanalla ötürmək
    ch := make(chan int)
    go func() {
        for _, v := range originalSlice {
            ch <- v
        }
        close(ch)
    }()
    
    // slice-i kanalla ötürmək
    chSlice := make(chan []int)
    go func() {
        chSlice <- originalSlice // başlıq ilə ötürmə, amma kanal sinxronizasiya edir
                                // vacib: göndərdikdən sonra originalSlice-i dəyişməyin
    }()
    
  3. sync.Mutex və ya sync.RWMutex ilə sinxronizasiya: Slice-ə girişləri mutex-lərlə qoruyun. Bu, yalnız bir gorutinin slice-i dəyişməsinə imkan verir.

    import "sync"
    
    var mu sync.Mutex
    var sharedSlice []int
    
    func modifySlice(index, value int) {
        mu.Lock()
        defer mu.Unlock()
        if index < len(sharedSlice) {
            sharedSlice[index] = value
        }
    }
    

Yanaşmaların müqayisəsi:

Yanaşma Təhlükəsizlik Böyük slice-lərlə performans Çətinlik
Slice nüsxəsi Yüksək Aşağı (məlumatların kopyalanması) Sadə
Kanallar Yüksək Asılıdır (kanal əməliyyatlarının xərci) Orta
Mutexlər Yüksək Yüksək (əgər ciddi münaqişələr yoxdursa) Orta

Beləliklə, slice başlığını əlavə sinxronizasiya və ya nüsxə olmadan müxtəlif gorutinlara ötürmək təhlükəsiz deyil. Məlumatların təhlükəsizliyini təmin etmək üçün yuxarıdakı metodlardan birini istifadə etmək lazımdır.