Exercício 2
Ligações importantes
Dicas práticas
Sugere-se abordar o exercício seguindo os 3 passos seguintes:
1. Começar por criar a pool de tarefas trabalhadoras
Inicialmente, começar por ter tarefas que executam algo simples, como imprimir no ecrã, adormecer alguns segundos e terminar.
Referências úteis:
- Man pages de pthread_create, pthread_exit, pthread_join
- Livro (secção 3.5.4 Tarefas – Interface POSIX)
- Slides das aulas teóricas. Em particular, exemplo de programa simples com pthread_create
2. Implementar a comunicação entre tarefa principal e trabalhadoras
Estudar solução para o problema dos produtores-consumidores, discutida nas aulas teóricas e adaptá-la para o contexto do projeto.
Passos sugeridos:
- Começar por declarar buffer e índices associados
- Implementar função que, após receção de comando, cria um pedido e coloca-o no buffer
- Implementar função que recebe o próximo pedido disponível no buffer
- Completar a solução acima com os mutexes e semáforos necessários
Referências úteis:
- Man pages de pthread_mutex_init, pthread_mutex_lock e pthread_mutex_unlock; sem_init, sem_wait e sem_post.
- Livro (secções 5.2 Mutex POSIX e 6.6.1 POSIX semáforos)
- Exemplos de programas nos slides das aulas teóricas
3. Sincronizar acessos concorrentes ao vector de contas
Perguntas frequentes
Deve a solução para o exercício 2 funcionar corretamente quando, em concorrência com as operações executadas pelas tarefas trabalhadoras, o processo pai lança processos filho para simulações?
Por simplificação, a solução para o exercício 2 deve assumir que o comando "simular" nunca é recebido, logo nunca são lançados processos filho para o executar. Ou seja, a solução do exercício 2 deve apenas suportar corretamente os comandos "debitar", "creditar", "lerSaldo", "sair" e "sair agora" (note-se que, não havendo processos filho, "sair" e "sair agora" acabam por ter o mesmo comportamento).
O campo "operacao" da estrutura comando_t é do tipo inteiro. Como deve ser preenchido?
A solução mais simples é definir constantes que identificam cada comando. Por exemplo, OP_LERSALDO 0, OP_CREDITAR 1, OP_DEBITAR 2, etc.