Sobes.tech
Middle

Чӣ тавр аз даврзании маълумотҳо канорагирӣ кардан мумкин аст? Mutex чӣ гуна кор мекунад?

sobes.tech AI

Ҷавоб аз AI

Дертароии маълумотҳо вақте рӯй медиҳанд, ки чанд горутин ҳамзамон ба манбаи умумӣ барои хондан ва навишт без синхронӣ дастрасӣ мекунанд, ки ба натиҷаҳои номуайян оварда мерасонад.

Барои пешгирии дертароии маълумотҳо дар Go, механизмҳои синхронгардонии мисли sync.Mutex истифода мешаванд. Mutex (истиснои мутақобил) як primitives аст, ки кафолат медиҳад, ки танҳо як горутин метавонад дар як вақт дар як қисмати критикӣ иҷро шавад.

Принсипи кории Mutex:

  • Пеш аз дастрасӣ ба манбаи умумӣ, горутин Lock()-ро даъват мекунад, ки mutex-ро мепӯшонад.
  • Агар mutex аллакай пӯшонида шуда бошад, горутин интизор мешавад, ки он озод шавад.
  • Пас аз анҷоми кор бо манбаъ, Unlock()-ро даъват мекунад, ки mutex-ро озод мекунад.

Масалан, истифодаи Mutex дар Go:

import (
    "fmt"
    "sync"
)

func main() {
    var mu sync.Mutex
    ҳисобкунанда := 0

    афзоиш диҳед := func() {
        mu.Lock()
        defer mu.Unlock()
        ҳисобкунанда++
    }

    var wg sync.WaitGroup
    for i := 0; i < 1000; i++ {
        wg.Add(1)
        go func() {
            defer wg.Done()
            афзоиш диҳед()
        }()
    }
    wg.Wait()
    fmt.Println("Ҳисобкунанда:", ҳисобкунанда)
}

Ин тавр, истифодаи Mutex пешгирӣ мекунад, ки дастрасӣ ҳамзамон ба маълумоти тақсимшуда сурат гирад ва дертароиро пешгирӣ мекунад.