No final deste guião, deverá ser capaz de:
- compreender os conceitos programação paralela com tarefas (que é um dos requisitos essenciais do 1º exercício do projeto de SO) e também com processos;
- utilizar primitivas para a gestão de tarefas como o
pthread_createepthread_join; - utilizar primitivas para a gestão de processos, como o
forkewait.
- Sistema operativo Linux Ubuntu 20.04 LTS (se não o tiverem disponível no vosso computador pessoal, podem utilizar os computadores do laboratório).
Clone este repositório, usando: git clone https://github.com/tecnico-so/lab_tarefas-processos.git.
Aceda à diretoria com o comando: cd lab_tarefas-processos.
Na pasta src estude, compile e execute a aplicação.
O programa cria diferentes tarefas (threads) a executar em paralelo.
Consulte o seguinte diagrama e interprete o resultado do programa.
Porque razão diferentes execuções do programa podem resultar em diferentes valores para variável global g_value?
Monte uma experiência que prove a afirmação anterior (ponto 1.1).
Sugestão: utilize a chamada sistema sleep.
Como iremos lidar com programas concorrentes aconselha-se a utilização do ThreadSanitizer para ajudar a detetar problemas de acessos concorrentes.
Para isto, note a ativação deste sanitizador com a opção -fsanitize na Makefile.
Revisite o guião sobre ferramentas de deteção de erros, onde pode encontrar mais detalhes sobre o uso de sanitizadores de código.
Componha um programa paralelo alternativo, process.c, em que as chamadas a pthread_create e pthread_join são substituídas por chamadas a fork e wait (tenha o cuidado de assegurar que a função wait só é chamada pelo processo pai).
Neste caso, o paralelismo acontecerá com processos distintos, e não com tarefas dentro do mesmo processo. O que muda no resultado que este novo programa imprime no stdout?
Contactos para sugestões/correções: LEIC-Alameda, LEIC-Tagus, LETI

