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:

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:

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.