Skip to content

Instantly share code, notes, and snippets.

@sottam
Last active September 11, 2018 19:45
Show Gist options
  • Save sottam/b8bdeb9b19004aea858a0d18026dcf88 to your computer and use it in GitHub Desktop.
Save sottam/b8bdeb9b19004aea858a0d18026dcf88 to your computer and use it in GitHub Desktop.
Solução para o problema do "Cigarrete Smokers" usando Mutex e C#. Alem disso, os fumantes ou pegam tudo da mesa, ou nada. Assim evita o deadlock.
using System;
using System.Threading;
namespace FumantesEmCSharp
{
class Program
{
static void Main(string[] args)
{
FumantesUsandoMutex ProblemaDosFumantes = new FumantesUsandoMutex();
ProblemaDosFumantes.Iniciar();
}
}
class FumantesUsandoMutex {
//Esse Mutex representa a mesa e vai cuidar da exclusao mutal entre as threads
//enquanto uma thread estiver acessando a mesa, a outra nao acessa
private static Mutex Mesa = new Mutex(false);
//Ingredients Value
private static int tabaco = 0, fosforo = 0, papel = 0;
const int MinAtraso = 10;
const int MaxAtraso = 200;
//Metodo para ser chamado pela classe pela Main
public void Iniciar()
{
// threads para o agente, fumantes
Thread Agente = new Thread(IniciarAgente);
Thread Fumante_Fosforo = new Thread(FumanteFosforo);
Thread Fumante_Tabaco = new Thread(FumanteTabaco);
Thread Fumante_Papel = new Thread(FumantePapel);
//iniciando threads
Fumante_Fosforo.Start();
Fumante_Tabaco.Start();
Fumante_Papel.Start();
Agente.Start();
}
static void IniciarAgente()
{
while (true)
{
// Espera a mesa ficar livre
Mesa.WaitOne();
//sorteia uma dupla de itens de fumantes para colocar na mesa
int random = new Random().Next(1, 4);
if (random == 1)
{
tabaco = 0; fosforo = 0; papel = 0;
Console.WriteLine("Papel e tabaco adicionados na mesa...");
tabaco++;
papel++;
Thread.Sleep(new Random().Next(MinAtraso, MaxAtraso));
}
else if (random == 2)
{
tabaco = 0; fosforo = 0; papel = 0;
Console.WriteLine("Papel e fosforo adicionados a mesa...");
fosforo++;
papel++;
Thread.Sleep(new Random().Next(MinAtraso, MaxAtraso));
}
else
{
tabaco = 0; fosforo = 0; papel = 0;
Console.WriteLine("Fosforo e tabaco adicionados a mesa...");
tabaco++;
fosforo++;
Thread.Sleep(new Random().Next(MinAtraso, MaxAtraso));
}
//Libera acesso a mesa
Mesa.ReleaseMutex();
}
}
static void FumanteFosforo()
{
while (true)
{
// Espera a mesa ficar livre
Mesa.WaitOne();
if(tabaco > 0 && papel > 0)
{
tabaco--;papel--;
Console.WriteLine($"Fumante(Fosforo) está fazendo o cigarro com Tabaco e Papel da mesa.");
Thread.Sleep(new Random().Next(MinAtraso, MaxAtraso));
// Libera a mesa
Mesa.ReleaseMutex();
Console.WriteLine("Fumante(Fosforo) está fumando...");
Thread.Sleep(new Random().Next(MinAtraso, MaxAtraso));
}
else
{
// Libera a mesa
Mesa.ReleaseMutex();
Console.WriteLine("Fumante(Fosforo) não achou o que precisa...");
Thread.Sleep(new Random().Next(MinAtraso, MaxAtraso));
}
}
}
static void FumanteTabaco()
{
while (true)
{
// Espera a mesa ficar livre
Mesa.WaitOne();
if (fosforo > 0 && papel > 0)
{
fosforo--; papel--;
Console.WriteLine($"Fumante(tabaco) está fazendo o cigarro com Fosforo e Papel da mesa.");
Thread.Sleep(new Random().Next(MinAtraso, MaxAtraso));
// Libera a mesa
Mesa.ReleaseMutex();
Console.WriteLine("Fumante(tabaco) está fumando...");
Thread.Sleep(new Random().Next(MinAtraso, MaxAtraso));
}
else
{
// Libera a Mesa
Mesa.ReleaseMutex();
Console.WriteLine("Fumante(tabaco) não achou o que precisa...");
Thread.Sleep(new Random().Next(MinAtraso, MaxAtraso));
}
}
}
static void FumantePapel()
{
while (true)
{
// Espera a mesa ficar livre
Mesa.WaitOne();
if (fosforo > 0 && tabaco > 0)
{
fosforo--; tabaco--;
Console.WriteLine($"Fumante(papel) está fazendo o cigarro com Fosforo e tabaco da mesa.");
Thread.Sleep(new Random().Next(MinAtraso, MaxAtraso));
// Libera a mesa
Mesa.ReleaseMutex();
Console.WriteLine("Fumante(papel) está fumando...");
Thread.Sleep(new Random().Next(MinAtraso, MaxAtraso));
}
else
{
// Libera a Mesa
Mesa.ReleaseMutex();
Console.WriteLine("Fumante(papel) não achou o que precisa...");
Thread.Sleep(new Random().Next(MinAtraso, MaxAtraso));
}
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment