Sobes.tech
Middle+

Cik droši ir izmantot slices konkursa (Concurrency) kontekstā?

sobes.tech AI

Atbilde no AI

Slišu izmantošana nav droša konkursa kontekstā bez papildu sinhronizācijas mehānismiem. Daudz vienlaicīgu piekļuvi lasīšanai un rakstīšanai vai divas vienlaicīgas piekļuves rakstīšanai uz to pašu atmiņas daļu (kas ir sērijas galvenais masīvs) noved pie datu sacensības stāvokļa (data race).

nesargājošo iemesli:

  1. Galvenā masīva maiņa: Slišs ir galvenā masīva attēlojums. Elementu pievienošanas operācijas (append), īpaši, ja tās pārsniedz pašreizējo ietilpību, var novest pie jaunas atmiņas sadalīšanas un datu kopēšanas uz jaunu masīvu. Ja tajā brīdī cita gorutīna mēģina lasīt vai rakstīt veco vai jauno masīvu, rodas datu sacensība.
  2. Sliša galvenes maiņa: Paša sliša galvene (struct, kas satur norādi uz galveno masīvu, garumu un ietilpību) arī var tikt mainīta append operācijas laikā. Vienlaicīga šīs galvenes lasīšana un rakstīšana bez bloķēšanas noved pie nenoteiktas uzvedības.

drošības nodrošināšanas mehānismi:

  • sync.Mutex / sync.RWMutex: Piekļuves bloķēšana pie sliša pirms katras lasīšanas vai rakstīšanas operācijas. sync.RWMutex ir piemērotāks biežai lasīšanai un retai rakstīšanai.

    import "sync"
    
    type SafeSlice struct {
        mu    sync.RWMutex
        items []int
    }
    
    func (s *SafeSlice) Append(item int) {
        s.mu.Lock() // Bloķēšana rakstīšanai
        defer s.mu.Unlock()
        s.items = append(s.items, item)
    }
    
    func (s *SafeSlice) Get(index int) (int, bool) {
        s.mu.RLock() // Bloķēšana lasīšanai
        defer s.mu.RUnlock()
        if index < 0 || index >= len(s.items) {
            return 0, false
        }
        return s.items[index], true
    }
    
  • Kanāli (Channels): Datu nodošana caur kanāliem. Viena gorutīna raksta datus, otra tos lasa no kanāla. Tas ir piemērots straumes datu apstrādes scenārijiem.

    // Piemērs, izmantojot kanālu datu nodošanai
    // scenārijā, kur viena gorutīna ražo, otra izmanto
    
  • sync.Map: Piemērots, ja slišs tiek izmantots kā atslēgu-vertību kartes pamats vai scenārijos, kur secība nav svarīga, bet konkurences drošība — kritiska.

Secinājums: Konkursa scenārijos slišu izmantošana prasa skaidru sinhronizācijas pārvaldību, lai novērstu datu sacensības. Vienkārša piekļuve slišam no vairākiem gorutīniem vienlaicīgi nav droša.