Exercício: Capítulo 20, Exercício 5 (Nível: 9)
Opened this issue · 4 comments
vkorbes commented
an4kein commented
https://play.golang.org/p/ElZ3fsscLpO
package main
import (
"fmt"
"runtime"
"sync"
"sync/atomic"
"time"
)
/* - 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 lista3 = [...]string{"anakein", "Zulema", "Saray", "Kabila", "Sole", "Macarena", "Anabel", "Palacios", "test"}
var rotinas = 1000
var contador = int64(0)
func conte() func() {
return func() {
wg.Add(rotinas)
for y := 0; y < rotinas; y++ {
go func() {
runtime.Gosched()
switch atomic.AddInt64(&contador, 1) {
case 1:
fmt.Println("Personagem: ", lista3[atomic.LoadInt64(&contador)])
case 2:
fmt.Println("Personagem: ", lista3[atomic.LoadInt64(&contador)])
case 3:
fmt.Println("Personagem: ", lista3[atomic.LoadInt64(&contador)])
case 4:
fmt.Println("Personagem: ", lista3[atomic.LoadInt64(&contador)])
case 5:
fmt.Println("Personagem: ", lista3[atomic.LoadInt64(&contador)])
case 6:
fmt.Println("Personagem: ", lista3[atomic.LoadInt64(&contador)])
case 7:
fmt.Println("Personagem: ", lista3[atomic.LoadInt64(&contador)])
case 8:
fmt.Println("Personagem: ", lista3[atomic.LoadInt64(&contador)])
}
wg.Done()
}()
}
}
}
func contador2() {
wg.Add(rotinas)
for i := 0; i < rotinas; i++ {
go func() {
atomic.AddInt64(&contador, 1)
time.Sleep(9 * time.Millisecond)
wg.Done()
}()
}
}
func main() {
conte()()
contador2()
wg.Wait()
fmt.Println("Valor final do contador: >>", atomic.LoadInt64(&contador))
fmt.Println("Valor final do contador na funcao 1: >>", atomic.LoadInt64(&contador))
}
Output
Personagem: Zulema
Personagem: Sole
Personagem: Kabila
Personagem: Saray
Personagem: Macarena
Personagem: Anabel
Personagem: Palacios
Personagem: test
Valor final do contador: >> 2000
Valor final do contador na funcao 1: >> 2000
Program exited.
Output from pc
wfrsilva commented
Cap. 20 – Exercícios: Nível #9 – 5
https://go.dev/play/p/KOddOEd4HBh
https://code.sololearn.com/cmT2ajNoO64t
wfrsilva/aprendago@9392615
LeandroCGMS commented
LeandroCGMS commented