Golang mutex

Golang mutex
En mutex refererer til en låsemekanisme som bare sikrer en funksjon eller goroutine får tilgang til en bestemt del av et program om gangen. Det er en kritisk del av samtidig styring som forhindrer raseforhold.

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:

  1. Låse()
  2. Låse opp()

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.