====== O Jantar dos filósofos ====== O Jantar dos Filósofos é problema clássico de sincronização proposto por Dijkstra em 1965. A capa da revista //Communications of the ACM// de Janeiro de 1988 ilustra a aplicação prática deste problema em uma situação do mundo real... {{ :so:jantar-filosofos.jpg |O Jantar dos filósofos, Communications of the ACM, January 1988}} ===== O problema ===== Este projeto consiste em implementar o problema do jantar dos filósofos em C, usando uma thread Posix para modelar cada filósofo e um semáforo Posix para cada palito (//chopstick//). Cada um dos 5 filósofos tem o seguinte comportamento: while (true) { meditar (duração aleatória entre 0 e 2 segundos) pegar o palito à sua esquerda pegar o palito à sua direita comer (duração aleatória entre 0 e 2 segundos) soltar os palitos } ===== Observações ===== * Devem ser usados semáforos POSIX na solução; laços de espera ocupada (//busy-wait//) **não são permitidos**. ===== Roteiro ===== - Implementar uma solução sem controle de impasses - Implementar uma solução com controle de impasses através de serialização ("solução do saleiro") - Implementar uma solução com controle de impasses que permita o máximo paralelismo entre os filósofos - Medir o número de filósofos que podem comer por segundo, nas três soluções (desabilitar as pausas para efetuar essa medição) Para medir o desempenho de cada solução, a //thread// principal (''main'') pode executar o seguinte laço, após ter criado as demais //threads//((Obrigado ao Marco Kawajiri por esta ideia)): while(1) { sleep (1) ; pthread_mutex_lock (&mut) ; printf ("Refeições por segundo: %d\n", numRefeicoes) ; numRefeicoes = 0 ; pthread_mutex_unlock (&mut) ; } O contador ''numRefeicoes'' deve ser incrementado cada vez que um filósofo comer; o //Mutex// ''mut'' serve para evitar condições de disputa envolvendo esse contador. Ambos devem ser variáveis globais. ===== A Entregar ===== - As implementações realizadas - Um relatório sucinto (e no [[teaching:regras das atividades de laboratorio#relatórios|formato correto]]) descrevendo os resultados observados nas experiências.