En løpsbetingelse refererer til en forekomst der mer enn en tråd prøver å få tilgang til delte data.
I denne artikkelen vil vi diskutere det grunnleggende om å implementere en mutex ved hjelp av Go Sync -pakken.
Golang Sync Package
Sync -pakken i Go gir oss verktøy og metoder for å implementere synkroniseringsoppgaver, for eksempel ventegrupper og gjensidige eksklusjoner.
For denne artikkelen er vi bare interessert i gjensidige eksklusjonslåser eller mutex for kort. SYNC -pakken gir oss to metoder for å implementere mutex i GO -programmene:
Hvis du plasserer en kode mellom lås- og låsingsmetodene, vil GO -programmer bare tillate en enkelt tråd eller goroutine å få tilgang til den koden.
La oss ta et enkelt program med løpsforhold:
pakkehoved
import (
"FMT"
"Synkronisering"
)
var x = 1
func add (wg *synkronisering.WaitGroup)
x++
wg.Gjort ()
func main ()
var waitgroup synkronisering.WaitGroup
for i: = 0; Jeg < 10000; i++
WaitGroup.Legg til (1)
Gå til (& WaitGroup)
WaitGroup.Vente()
fmt.Println (x)
I forrige eksempel har vi en funksjon som tar verdien av x og trer den med 1. Funksjonen ber deretter ventegruppen om å fjerne blokkering av ventemekanismen ved hjelp av Done () -funksjonen.
Inne i hovedfunksjonen kjører vi minst 10.000 goroutines samtidig, hver prøver å få tilgang til og endre verdien på x.
Siden det ikke er noen deterministisk rekkefølge for å kjøre goroutinene, endres (øker verdien av x) verdien av x endringer ved hvert løp.
For å løse for den forrige løpstilstanden, kan vi bruke en mutex som vist nedenfor:
pakkehoved
import (
"FMT"
"Synkronisering"
)
var x = 1
func add (wg *synkronisering.WaitGroup, MX *Synkronisering.Mutex)
// Lås tilgang til denne verdien
MX.Låse()
x++
MX.Låse opp()
wg.Gjort ()
func main ()
var waitgroup synkronisering.WaitGroup
var mutex synkronisering.Mutex
for i: = 0; Jeg < 10000; i++
WaitGroup.Legg til (1)
gå til (& waitgroup, & mutex)
WaitGroup.Vente()
fmt.Println (x)
Her legger vi til mx av typen synkronisering.Mutex til add -funksjonen. Deretter låser vi inkrementoperatøren for å tillate en enkelt goroutine om gangen.
Lukking
Denne artikkelen dekket det grunnleggende ved å implementere en mutex i GO ved å bruke SYNC -pakken for å fikse en enkel løpsbetingelse. Vi håper du fant denne artikkelen nyttig. Sjekk ut andre Linux -hint -artikler for flere tips og informasjon.