public void NotificaRodada(Canguru canguru)
 {
     lock (passos)
     {
         if (passos.ContainsKey(canguru))
         {
             passos[canguru] = true;
         }
     }
 }
 public void NotificaTermino(Canguru canguru)
 {
     lock (termino)
     {
         if (termino.ContainsKey(canguru))
         {
             termino[canguru] = true;
         }
     }
 }
 public bool GetStep(Canguru canguru)
 {
     lock (passos)
     {
         if (passos.ContainsKey(canguru))
         {
             return(passos[canguru]);
         }
         else
         {
             return(false);
         }
     }
 }
        public void IniciarCorrida()
        {
            Random r            = new Random();
            int    totalCorrida = r.Next(80, 101);

            // Cria cangurus com nomes
            Canguru c1 = new Canguru(this, 1, "Felizberto", totalCorrida);
            Canguru c2 = new Canguru(this, 2, "Mimoso", totalCorrida);
            Canguru c3 = new Canguru(this, 3, "Malandro", totalCorrida);
            Canguru c4 = new Canguru(this, 4, "Vendaval", totalCorrida);
            Canguru c5 = new Canguru(this, 5, "Soberano", totalCorrida);

            cangurus.Add(c1);
            cangurus.Add(c2);
            cangurus.Add(c3);
            cangurus.Add(c4);
            cangurus.Add(c5);

            // Inicializa threads e roda elas
            foreach (Canguru c in cangurus)
            {
                Thread cthread = new Thread(new ThreadStart(c.Executa));
                cthread.Start();

                // Cria flags de controle de fim de corrida e de fim de passo
                termino.Add(c, false);
                passos.Add(c, false);
            }

            bool isDone = false;

            // Ficamos no loop até a corrida terminar
            while (!isDone)
            {
                lock (termino)
                {
                    // Todos os cangurus notificaram que acabou a corrida pra eles? Se sim, acabou a corrida.
                    isDone = termino.All(i => i.Value == true);
                    if (isDone)
                    {
                        continue;
                    }
                }
                // Corrida não acabou, precisamos contar essa rodada
                lock (passos)
                {
                    bool allstepsdone = true;
                    // Verificamos se tem algum canguru que ainda não terminou essa rodada
                    for (int i = 0; i < passos.Count; i++)
                    {
                        Canguru c = passos.Keys.ElementAt(i);
                        if (passos[c] == false)
                        {
                            allstepsdone = false;
                        }
                    }

                    // Se todos terminaram a rodada, podemos marcar a flag como falso pra que uma nova rodada se inicie
                    if (allstepsdone)
                    {
                        for (int i = 0; i < passos.Count; i++)
                        {
                            Canguru c = passos.Keys.ElementAt(i);
                            passos[c] = false;
                        }
                    }
                }
            }

            // Ordena cangurus na ordem de quem pulou menos e chegou mais longe.
            List <Canguru> ordenado = cangurus.OrderBy(i => i.pulos).OrderByDescending(i => i.totalPercorrido).ToList();

            // Imprime na tela a colocação.
            Console.WriteLine();
            int colocacao = 1;

            foreach (Canguru c in ordenado)
            {
                Console.WriteLine("Canguru " + c.Nome + " ficou em " + colocacao.ToString() + "o. lugar. ");
                colocacao++;
            }
        }