Golang Mutex

Golang Mutex
Mutex odnosi się do mechanizmu blokującego, który zapewnia tylko jedną funkcję lub goroutinę dostęp do określonej części programu na raz. Jest to kluczowa część zarządzania współbieżnościami, która zapobiega warunkom rasowym.

Warunek wyścigu odnosi się do instancji, w której więcej niż jeden wątek próbuje uzyskać dostęp do udostępnionych danych.

W tym artykule omówimy podstawy wdrożenia mutex za pomocą pakietu Go Sync.

Pakiet synchronizacji Golang

Pakiet synchronizacji w GO zapewnia nam narzędzia i metody wdrażania zadań synchronizacji, takich jak Waitgroups i Mutual Excusions.

W tym artykule jesteśmy zainteresowani wyłącznie blokadami lub Mutex Mutex. Pakiet synchronizacji zapewnia nam dwie metody wdrażania Mutex w programach GO:

  1. Zamek()
  2. Odblokować()

Jeśli umieścisz jakikolwiek kod między metodami blokady i odblokowania, programy GO pozwolą tylko na jeden wątek lub goroutine na dostęp do tego kodu.

Weźmy prosty program z warunkami wyścigowymi:

Pakiet Main
import (
„FMT”
„Synchronizacja”
)
var x = 1
FUNC Add (WG *Sync.Waitgroup)
X++
WG.Zrobione()

func main ()
var Waitgroup Sync.Waitgroup
dla i: = 0; I < 10000; i++
Waitgroup.Dodaj (1)
idź Dodaj (i Waitgroup)

Waitgroup.Czekać()
fmt.Println (x)

W poprzednim przykładzie mamy funkcję, która przyjmuje wartość x i zwiększa ją o 1. Następnie funkcja mówi grupie oczekującej, aby odblokować mechanizm oczekujących za pomocą funkcji gotowych ().

W ramach głównej funkcji uruchamiamy co najmniej 10 000 Goroutinów jednocześnie, z których każda próbuje uzyskać dostęp i zmieniać wartość x.

Ponieważ nie ma deterministycznej kolejności uruchamiania Goroutinów, (zwiększenie wartości x) wartości x zmienia się na każdym biegu.

Aby rozwiązać poprzedni stan wyścigu, możemy użyć mutex, jak pokazano poniżej:

Pakiet Main
import (
„FMT”
„Synchronizacja”
)
var x = 1
FUNC Add (WG *Sync.Waitgroup, MX *Sync.Mutex)
// Zamknij dostęp do tej wartości
MX.Zamek()
X++
MX.Odblokować()
WG.Zrobione()

func main ()
var Waitgroup Sync.Waitgroup
Synchronizacja Var Mutex.Mutex
dla i: = 0; I < 10000; i++
Waitgroup.Dodaj (1)
idź dodaj (& Waitgroup i Mutex)

Waitgroup.Czekać()
fmt.Println (x)

Tutaj dodajemy MX typu synchronizacji.Mutex do funkcji dodawania. Następnie blokujemy operator przyrostowy, aby umożliwić pojedynczą goroutinę jednocześnie.

Zamknięcie

Ten artykuł obejmował podstawy wdrożenia mutex w Go za pomocą pakietu synchronizacji w celu ustalenia prostego stanu wyścigu. Mamy nadzieję, że ten artykuł jest pomocny. Sprawdź inne artykuły w Linux, aby uzyskać więcej wskazówek i informacji.