Link: github.com/edu-bm7/Philosophers

Como parte da minha jornada como Engenheiro de Software, aceitei o desafio de resolver o Problema dos Filósofos Jantando. Este clássico problema de sincronização envolve encontrar uma solução para permitir que um grupo de filósofos jante pacificamente, aderindo a certas restrições.

Neste projeto, enfrentei dois conjuntos distintos de requisitos para resolver o Problema dos Filósofos Jantando, cada um com suas próprias restrições e abordagens únicas.

Primeira Solução: Threads e Mutex

Na primeira solução, precisei representar cada filósofo como uma thread separada. As restrições eram que os filósofos não podiam se comunicar entre si, e dois garfos eram necessários para um filósofo comer. Para alcançar isso, utilizei mutexes (exclusão mútua) para garantir o acesso exclusivo aos garfos pelos filósofos. Uma única thread atuava como um Árbitro, monitorando as atividades dos filósofos e determinando quando a simulação deveria terminar.

Segunda Solução: Processos e Semáforos

A segunda solução apresentou desafios diferentes. Aqui, representei cada filósofo como um processo separado, mas com a restrição de que o processo principal não poderia ser um filósofo. Os filósofos ainda não podiam se comunicar entre si, e os garfos foram colocados no centro da mesa sem a permissão de utilizar qualquer memória compartilhada ou variáveis globais, e com os garfos não tendo estado na memória. Em vez disso, empreguei semáforos para representar a disponibilidade dos garfos. Um aspecto interessante desta solução foi que não pude usar sinais para comunicação interprocessos (IPC). Para superar essa limitação, introduzi uma Thread Árbitro para cada processo, usando a função kill() como meio de IPC para sinalizar quando um filósofo havia completado sua tarefa, facilitando o término da simulação.

philosophers image