Jantar dos filósofos
O problema dos filósofos consiste em 5 filósofos sentados em uma mesa circular, realizando duas tarefas: pensar ou comer. Enquanto comem, os filósofos não pensam e enquanto pensam, os filósofos não comem.
Na mesa circular, existe um prato de spaghetti para cada filósofo e existe 1 garfo entre cada dois pratos, exemplificado na imagem abaixo. Para comer, o filósofo necessita dos dois garfos (da sua esquerda e da sua direita).
Este problema também pode gerar um deadlock. Isto ocorre na seguinte situação: suponha que todos os filósofos desejem comer ao mesmo tempo. Assim, todos pegam o seu garfo da esquerda simultaneamente. Ao tentarem pegar o garfo da direita, todos os filósofos esperarão eternamente, pois cada filósofo está segurando um garfo.
Na seguinte solução, utilizaremos threads e semáforos. Uma thread para cada um dos filósofos e semáforos para garantir que situações de deadlock não ocorrerão.
Na solução, mantemos constante a quantidade de tempo que o filósofo permanece comendo e a quantidade de tempo que ele permanece pensando. Cada filósofo permanece em 3 estados: HUNGRY, EATING ou THINKING, explicados no código. Caso se deseje maior aleatoriedade na simulação, é possível alterar estes valores para randômicos, utilizando a função rand().
Utilizaremos as instruções sem_wait e sem_post para controlar o acesso às regiões críticas.
SYNOPSIS
#include <semaphore.h>
int sem_wait(sem_t *sem); int sem_trywait(sem_t *sem);
SYNOPSIS
#include <semaphore.h> int sem_post(sem_t *sem);
Para criar estes semáforos, vamos utilizar os seguintes comandos sem_t e sem_init:
SYNOPSIS
#include <semaphore.h> int sem_init(sem_t *sem, int pshared, unsigned int value);
Além disso, devemos criar as threads. Isto pode ser feito utilizando os seguintes comandos: declaração: pthread_t criação: pthread_create() –
SYNOPSIS
#include <pthread.h>
int pthread_create(pthread_t