Operador Join

Video deste projeto

O objetivo deste projeto é construir uma função de sincronização denominada task_join, que permite que uma tarefa espere a conclusão de outra tarefa, de forma similar à chamada POSIX pthread_join:

int task_join (task_t *task)

A chamada task_join(b) faz com que a tarefa atual (corrente) seja suspensa até a conclusão da tarefa b: quando a tarefa b encerrar (usando a chamada task_exit), a tarefa suspensa deve ser colocada de volta na fila de tarefas prontas, para retomar sua execução. Lembre-se que várias tarefas podem ficar aguardando que a tarefa b encerre, então todas elas têm de ser acordadas quando isso ocorrer.

Caso a tarefa b não exista ou já tenha encerrado, esta chamada deve retornar imediatamente, sem suspender a tarefa corrente.

O valor de retorno da chamada task_join deve ser o código de encerramento da tarefa b (valor exit_code informado como parâmetro de task_exit), ou -1, caso a tarefa indicada não exista ou algum outro erro.

Sua implementação deverá funcionar com este código e gerar uma saída similar a este exemplo.

Use o controle de preempção para evitar condições de disputa nas variáveis envolvidas.

Para facilitar a construção deste e dos próximos projetos, sugere-se a implementação dos operadores suspend e resume descritos a seguir:

void task_suspend (task_t **queue) ;

Suspende a tarefa atual através das seguintes ações:

  1. retira a tarefa atual da fila de tarefas prontas (se estiver nela);
  2. ajusta o status da tarefa atual para “suspensa”;
  3. insere a tarefa atual na fila apontada por queue;
  4. retorna ao dispatcher.
void task_resume (task_t * task, task_t **queue) ;

Reativa uma tarefa que está suspensa em uma dada fila, através das seguintes ações:

  1. se a fila queue não for nula, retira a tarefa apontada por task dessa fila;
  2. ajusta o status dessa tarefa para “pronta”;
  3. insere a tarefa na fila de tarefas prontas.

Juntos, esses dois operadores simplificam suspender e reativar tarefas, sem precisar manipular diretamente a fila de tarefas prontas.

  • so/operador_join.txt
  • Última modificação: 2022/08/02 17:21
  • por maziero