Open vkorbes opened 3 years ago
https://play.golang.org/p/noVNFlqx939
Um race condition muito locooo.. kk
package main
import (
"fmt"
"runtime"
"sync"
"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 = 0
func conte() func() {
return func() {
wg.Add(rotinas)
for x := 0; x < rotinas; x++ {
go func() {
defer wg.Done()
x := contador
x++
time.Sleep(2 * time.Millisecond)
contador = x
switch contador {
case 1:
fmt.Println(lista3[contador])
case 2:
fmt.Println(lista3[contador])
case 3:
fmt.Println(lista3[contador])
case 4:
fmt.Println(lista3[contador])
case 5:
fmt.Println(lista3[contador])
case 6:
fmt.Println(lista3[contador])
case 7:
fmt.Println(lista3[contador])
case 8:
fmt.Println(lista3[contador])
}
contador = x
}()
}
}
}
func contador2() {
wg.Add(rotinas)
for i := 0; i < rotinas; i++ {
go func() {
defer wg.Done()
x := contador
runtime.Gosched()
x++
contador = x
}()
}
}
func main() {
conte()()
wg.Wait()
contador2()
fmt.Println("Valor final do contador", contador)
fmt.Println("Valor final do contador na funcao 1", contador)
}
Output
Zulema
Zulema
Zulema
Zulema
Zulema
Zulema
Zulema
Zulema
Valor final do contador 5
Valor final do contador na funcao 1 8
Program exited.
Output from my pc
Cap. 20 – Exercícios: Nível #9 – 3
https://go.dev/play/p/fszW57eD0UM
https://github.com/wfrsilva/aprendago/commit/9b2fca922311554b649d130e14cbea393c567096
package main
import (
"fmt"
"runtime"
"sync"
)
var ws sync.WaitGroup
var contar int
const quantidadeGruotime = 60
func main() {
criarGroutime(quantidadeGruotime)
ws.Wait()
fmt.Println("Total de Groutime\t ", quantidadeGruotime, "\nTotal de contador\t", contar)
}
func criarGroutime(l int) {
ws.Add(l)
for i := 0; i < l; i++ {
go func() {
vs := contar
runtime.Gosched()
vs++
contar = vs
ws.Done()
}()
}
}
package main
import (
"fmt"
"runtime"
"sync"
)
var ws sync.WaitGroup
var contar int
const quantidadeGruotime = 60
func main() {
criarGroutime(quantidadeGruotime)
ws.Wait()
fmt.Println("Total de Groutime\t ", quantidadeGruotime, "\nTotal de contador\t", contar)
}
func criarGroutime(l int) {
ws.Add(l)
for i := 0; i < l; i++ {
go func() {
vs := contar
runtime.Gosched()
vs++
contar = vs
ws.Done()
}()
}
}
Exercício: Capítulo 20, Exercício 3 (Nível: 9)
Use esta thread para compartilhar sua solução, discutir o exercício com os colegas e pedir ajuda caso tenha dificuldades!