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 3 (Nível: 9) #61

Open vkorbes opened 3 years ago

vkorbes commented 3 years ago

Exercício: Capítulo 20, Exercício 3 (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/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

image

wfrsilva commented 2 years ago

Cap. 20 – Exercícios: Nível #9 – 3 https://go.dev/play/p/fszW57eD0UM https://github.com/wfrsilva/aprendago/commit/9b2fca922311554b649d130e14cbea393c567096 image

LelecoNN commented 8 months ago

Playground

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()
        }()

    }

}
LelecoNN commented 8 months ago

Playground

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()
        }()

    }

}