Golang Sync

Golang Sync
O pacote de sincronização de Golang fornece primitivas de sincronização, como mutex, grupo de espera, pool, leitura e gravação mutex e variáveis ​​de condição.

Vamos explorar alguns recursos fornecidos neste artigo.

Golang Mutex

A sincronização.Mutex fornece uma primitiva mutex, que permite exclusões mútuas para recursos compartilhados que impedem as condições de raça.

Exemplo de uso:

Pacote principal
importar "sincronização"
func main ()
var i = 10
mutex: = & Sync.Mutex
Mutex.Trancar()
// apenas uma goroutina pode acessar este código por vez
eu++
Mutex.Desbloqueio ()

Ler/escrever mutex

A sincronização.Rwmutex fornece um leitor/escritor mutex. Ele oferece métodos semelhantes como um mutex primitivo, mas pode permitir leituras simultâneas usando métodos RLOCK e RUNLOCK:

var i = 10
mutex: = & Sync.Rwmutex
Mutex.Trancar()
// apenas uma goroutina pode acessar este código por vez
eu++
Mutex.Desbloqueio ()
Mutex.Rlock ()
i ++ // leituras simultâneas
Mutex.Runlock ()

O exemplo anterior pode permitir que mais de uma goroutine leia o código. Ao contrário da sincronização.Mutex, que permite exatamente um leitor e um escritor de cada vez.

Grupos de espera

A sincronização.O WaitGroup é usado para oferecer um mecanismo de bloqueio para Goroutines. Usando um grupo de espera, você pode bloquear a execução de uma função até que todas as goroutinas terminem de executar.

Funciona criando um contador que mantém o número de goroutinas para esperar. Uma vez concluído uma goroutina, o contador diminui em 1. Uma vez que o contador é 0, o grupo de espera desbloqueia a execução.

Para agregar um valor ao contador do grupo de espera, podemos usar o método add (), que leva um valor inteiro.

Para remover uma goroutina do balcão após a conclusão, usamos o método feito (). Por exemplo:

Pacote principal
importação (
"FMT"
"sincronizar"
)
func main ()
WG: = & SYNC.Grupo de espera
para i: = 0; eu < 5; i++
WG.Adicionar (1)
vá func (x int)
fmt.Printf ("Trabalhador: %d Running \ n", x)
WG.Feito()
(eu)

WG.Espere()

No exemplo anterior, incrementamos o valor do contador do grupo de espera por 1 através do uso da função add ().

Depois que uma goroutina está concluída, diminuímos o contador em 1 usando o método feito (). O código anterior deve retornar a saída como:

Trabalhador: 4 correndo
Trabalhador: 2 correndo
Trabalhador: 1 corrida
Trabalhador: 3 correndo
Trabalhador: 0 correndo

Uma vez

A sincronização.Uma vez primitivo garante que uma função seja executada apenas uma vez. Um exemplo é como mostrado abaixo:

var uma vez sincronizado.Uma vez
RUNONCE: = func ()
fmt.Println ("Run ONE")

feito: = make (string chan)
para i: = 0; eu < 5; i++
vá func ()
uma vez.Fazer (RUNONCE)
feito <- "Hi"
()

para i: = 0; eu < 5; i++
<-done

Conclusão

Este guia abrange algumas primitivas básicas e fundamentais fornecidas pelo pacote Go Sync. Além disso, primitivas de sincronização, como mutex, grupo de espera, piscina, leitura e gravação mutex e variáveis ​​de condição, foram discutidas. Esperamos que você tenha achado este artigo útil. Confira outros artigos de dica do Linux para obter mais dicas e tutoriais.