O Golang Mutex

O Golang Mutex
Um mutex refere -se a um mecanismo de travamento que garante que apenas uma função ou goroutine esteja acessando uma seção específica de um programa por vez. É uma parte crítica do gerenciamento de simultaneidade que impede as condições de raça.

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:

  1. Trancar()
  2. Desbloqueio ()

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.