Open vkorbes opened 3 years ago
https://play.golang.org/p/osZmVgp_mbr fix: https://play.golang.org/p/1hGfrzqmvWa
package main
import (
"fmt"
"runtime"
"sync"
)
/* - Utilizando goroutines, crie um programa incrementador:
- Tenha uma variável com o valor da contagem
- Crie um monte de goroutines, onde cada uma deve:
- Ler o valor do contador
- Salvar este valor
- Fazer yield da thread com runtime.Gosched()
- Incrementar o valor salvo
- Copiar o novo valor para a variável inicial
- Utilize WaitGroups para que seu programa não finalize antes de suas goroutines.
- Demonstre que há uma condição de corrida utilizando a flag -race */
var wg sync.WaitGroup
var miu sync.Mutex
var lista3 = [...]string{"anakein", "Zulema", "Saray", "Kabila", "Sole", "Macarena", "Anabel", "Palacios", "test"}
var rotinas = 10000
var contador = 0
func conte() func() {
wg.Add(rotinas)
return func() {
for x := 0; x < rotinas; x++ {
go func() {
miu.Lock()
x := contador
x++
runtime.Gosched()
//time.Sleep(2 * time.Millisecond)
//contador = x
switch contador {
case 1:
fmt.Println("Personagem: ", lista3[contador])
case 2:
fmt.Println("Personagem: ", lista3[contador])
case 3:
fmt.Println("Personagem: ", lista3[contador])
case 4:
fmt.Println("Personagem: ", lista3[contador])
case 5:
fmt.Println("Personagem: ", lista3[contador])
case 6:
fmt.Println("Personagem: ", lista3[contador])
case 7:
fmt.Println("Personagem: ", lista3[contador])
case 8:
fmt.Println("Personagem: ", lista3[contador])
}
contador = x
miu.Unlock()
wg.Done()
}()
}
}
}
func contador2() {
wg.Add(rotinas)
for i := 0; i < rotinas; i++ {
go func() {
miu.Lock()
x := contador
runtime.Gosched()
x++
contador = x
miu.Unlock()
wg.Done()
}()
}
}
func main() {
conte()()
contador2()
wg.Wait()
fmt.Println("Valor final do contador: >>", contador)
fmt.Println("Valor final do contador na funcao 1: >>", contador)
}
Output
Personagem: Zulema
Personagem: Saray
Personagem: Kabila
Personagem: Sole
Personagem: Macarena
Personagem: Anabel
Personagem: Palacios
Personagem: test
Valor final do contador: >> 20000
Valor final do contador na funcao 1: >> 20000
Program exited.
Cap. 20 – Exercícios: Nível #9 – 4
https://go.dev/play/p/SVg485QohKz
https://github.com/wfrsilva/aprendago/commit/e2ee807077cb0b31f9df697a0aaa1b32f20f8a5b
Exercício: Capítulo 20, Exercício 4 (Nível: 9)
Use esta thread para compartilhar sua solução, discutir o exercício com os colegas e pedir ajuda caso tenha dificuldades!