# Exercícios Preparatórios — Projeto Philosophers Bem-vindo ao repositório de exercícios práticos desenhados para construir, passo a passo, todos os conceitos necessários para dominar o projeto Philosophers da 42. Aqui vais encontrar desafios progressivos sobre threads, mutexes, deadlocks, sincronização, semáforos, timing, e muito mais em C. ## Objetivo A proposta deste repositório é guiar estudantes pela aprendizagem real de programação concorrente, partindo do absoluto básico até à implementação de sistemas completos e robustos capazes de resolver o clássico problema dos Filósofos, incluindo as regras e desafios da bonus part. ## Estrutura dos Exercícios Cada exercício segue uma estrutura clara e normalizada, incluindo: - **Assignment name** - **Expected files** - **Allowed functions** - **Descrição do problema** - **Sugestão/Hint para a resolução** ### Lista de Exercícios | Nº | Nome | Conteúdo-chave | |----|---------------------------|---------------------------------------------| | 1 | thread_basics | Threads, pthread_create, pthread_join | | 2 | mutex_basics | Mutexes, race conditions | | 3 | precise_timing | gettimeofday, usleep, timing | | 4 | state_monitor | Monitorização, enums, padrões monitor | | 5 | producer_consumer | Sincronização, coordination problems | | 6 | deadlock_demo | Deadlock, prevenção de deadlock | | 7 | limited_resources | Semáforo manual, acesso limitado | | 8 | simple_philosophers | Problema dos filósofos simplificado | | 9 | death_monitor | Monitorização de vida, threads watchdog | | 10 | philosophers_args | Implementação 'full', argumentos | | 11 | race_detector | Data races, otimização de locks | | 12 | philosophers_bonus | Processos, semáforos POSIX, bonus part | ## Como usar 1. **Cada exercício é independente.** Recomenda-se seguir pela ordem, para garantir a aprendizagem progressiva. 2. **Compilar cada exercício:** ```sh gcc -Wall -Wextra -Werror -pthread .c -o ``` 3. **Executar cada binário** seguindo as instruções e exemplos do cabeçalho do exercício. ## Requisitos Técnicos - Compilador C (ex: gcc) - Ambiente POSIX (Linux ou Mac OS X recomendado) - Bibliotecas pthreads standard ## Recomendações - Não uses funções externas às permitidas. - Lê atentamente os hints fornecidos para cada exercício. - Analisa erros de race condition e deadlocks usando ferramentas como `valgrind --tool=helgrind`. - Consulta [The Little Book of Semaphores](https://greenteapress.com/wp/semaphores/) para cimentar conceitos. ## Créditos e Referências - Inspirado no livro open-source **The Little Book of Semaphores** por Allen B. Downey. - Estrutura e avaliação baseadas no formato dos projetos 42. - Problema clássico dos Filósofos por Edsger W. Dijkstra.