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:
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.