Uma condição de corrida refere -se a uma instância em que mais de um tópico tenta acessar dados compartilhados.
Neste artigo, discutiremos o básico da implementação de um mutex usando o pacote Go Sync.
Pacote de sincronização de Golang
O pacote de sincronização em Go nos fornece ferramentas e métodos para implementar tarefas de sincronização, como grupos de espera e exclusões mútuas.
Para este artigo, estamos interessados apenas nas bloqueios de exclusões mútuas ou mutex para curta. O pacote de sincronização nos fornece dois métodos para implementar o MUTEX nos programas GO:
Se você colocar algum código entre os métodos de bloqueio e desbloqueio, os programas GO permitirão apenas um único tópico ou goroutine acessar esse código.
Vamos fazer um programa simples com condições de corrida:
Pacote principal
importação (
"FMT"
"sincronizar"
)
var x = 1
func add (WG *Sync.WaitGroup)
x++
WG.Feito()
func main ()
Var WaitGroup Sync.Grupo de espera
para i: = 0; eu < 10000; i++
Grupo de espera.Adicionar (1)
vá add (& waitgroup)
Grupo de espera.Espere()
fmt.Println (x)
No exemplo anterior, temos uma função que pega o valor de x e o incrementa em 1. A função então diz ao grupo de espera para desbloquear o mecanismo de espera usando a função feita ().
Dentro da função principal, executamos pelo menos 10.000 goroutinas simultaneamente, cada uma tentando acessar e alterar o valor de x.
Como não há ordem determinística para executar as goroutinas, o valor (incremento do valor de x) de x muda a cada execução.
Para resolver a condição de corrida anterior, podemos usar um mutex como mostrado abaixo:
Pacote principal
importação (
"FMT"
"sincronizar"
)
var x = 1
func add (WG *Sync.Grupo de espera, MX *SYNC.Mutex)
// bloqueia o acesso a este valor
mx.Trancar()
x++
mx.Desbloqueio ()
WG.Feito()
func main ()
Var WaitGroup Sync.Grupo de espera
var mutex sincroniza.Mutex
para i: = 0; eu < 10000; i++
Grupo de espera.Adicionar (1)
vá add (& waitgroup, & mutex)
Grupo de espera.Espere()
fmt.Println (x)
Aqui, adicionamos mx do tipo sincronização.Mutex para a função Adicionar. Em seguida, travamos o operador de incremento para permitir uma única goroutina de cada vez.
Fechamento
Este artigo abordou os fundamentos da implementação de um mutex em Go usando o pacote de sincronização para corrigir uma condição de corrida simples. Esperamos que você tenha achado este artigo útil. Confira outros artigos de dica do Linux para obter mais dicas e informações.