Last active
September 11, 2018 19:45
-
-
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.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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