Sobes.tech
Middle+

Kui turvaline on saata slices erinevatesse goroutine'idesse?

sobes.tech AI

Vastus AI-lt

Otse sľazsi edastamine erinevatesse gorutinidesse pole ohutu, kui gorutined muudavad neid samaaegselt ilma sünkroniseerimiseta või kui sľazs muutub ühes gorutinas pärast selle edastamist (pealkirja koopiaga) teise.

Ohutud viisid sľazsidega töötamiseks gorutinides:

  1. Koopia edastamine: Loo täielik sľazi koopia ja edasta see. See on ohutu, kuna gorutined töötavad eraldi andmetega.

    // täieliku sľazi koopia loomine
    newSlice := make([]int, len(originalSlice))
    copy(newSlice, originalSlice)
    
  2. Kanalite kasutamine: Edasta sľazi elemente või sľazi ennast kanalite kaudu. Kanalid tagavad sünkroniseerimise ja andmete isolatsiooni.

    // elementide edastamine kanali kaudu
    ch := make(chan int)
    go func() {
        for _, v := range originalSlice {
            ch <- v
        }
        close(ch)
    }()
    
    // sľazi edastamine kanali kaudu
    chSlice := make(chan []int)
    go func() {
        chSlice <- originalSlice // pealkirja edastamine, kuid kanal sünkroniseerib
                                // oluline: ära muuda originalSlice pärast saatmist
    }()
    
  3. Sünkroniseerimine kasutades sync.Mutex või sync.RWMutex: Kaitsta sľazi juurdepääsu mutexide abil. See tagab, et ainult üks gorutin saab sľaziga korraga töötada.

    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
        }
    }
    

Võrdlustabel:

Lähenemine Ohutus Tõhusus suurte sľazside puhul Komplekssus
Koopia sľazs Kõrge Madalam (andmete kopeerimine) Lihtne
Kanalid Kõrge Sõltub (kanali operatsioonide maksumus) Keskmine
Mutexid Kõrge Kõrge (kui konflikte pole palju) Keskmine

Seega, sľazi pealkirja edastamine vaikimisi erinevatesse gorutinidesse ilma täiendava sünkroniseerimise või kopeerimiseta pole ohutu. Andmete turvalisuse tagamiseks tuleks kasutada ühte eelnevalt kirjeldatud meetoditest.