vkorbes / aprendago

Curso completo em português da linguagem Go, de zero a ninja! 🇧🇷
http://aprendago.com
991 stars 180 forks source link

Exercício: Capítulo 20, Exercício 5 (Nível: 9) #63

Open vkorbes opened 3 years ago

vkorbes commented 3 years ago

Exercício: Capítulo 20, Exercício 5 (Nível: 9)

Link para o vídeo:

Use esta thread para compartilhar sua solução, discutir o exercício com os colegas e pedir ajuda caso tenha dificuldades!

an4kein commented 3 years ago

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

image

wfrsilva commented 2 years ago

Cap. 20 – Exercícios: Nível #9 – 5 https://go.dev/play/p/KOddOEd4HBh https://code.sololearn.com/cmT2ajNoO64t https://github.com/wfrsilva/aprendago/commit/93926159312b81c0ffd4f02f790b31b2286ae21d image

LeandroCGMS commented 1 month ago

https://go.dev/play/p/wj--GIpouaW

LeandroCGMS commented 1 month ago

image