vkorbes/aprendago

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

Opened this issue · 4 comments

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!

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