Baixe o app para aproveitar ainda mais
Prévia do material em texto
Algoritmo “concorrentes” Var // Variaveis de controle das threads thread thread_A, thread_B, thread_C: thread; // Semaforos de controle sema_impressora, sema_plotter, sema_scanner: semaforo; Procedimento Proc_A() Início Enquanto (verdadeiro) Faça // Procedimento nunca termina processa_algo(); aloca_plotter(); processa_algo(); libera_plotter(); Fim Enquanto; Fim; Procedimento Proc_B() Início Enquanto (verdadeiro) Faça // Procedimento nunca termina processa_algo(); aloca_scanner(); processa_algo(); aloca_impressora(); processa_algo(); aloca_plotter(); processa_algo(); libera_plotter(); libera_impressora(); libera_scanner(); Fim Enquanto; Fim; Procedimento Proc_C() Início Enquanto (verdadeiro) Faça // Procedimento nunca termina processa_algo(); aloca_impressora(); processa_algo(); aloca_scanner(); processa_algo(); libera_impressora(); libera_scanner(); Fim Enquanto; Fim; Início sema_impressora = 1; // Inicia semaforo de controle da impressora sema_plotter = 1; // Inicia semaforo de controle do plotter sema_scanner = 1; // Inicia semaforo de controle do scanner // Inicia as threads colocando-as em execução paralelamente pthread_create(thread_A, Proc_A); // Inicia Proc_A como uma thread pthread_create(thread_B, Proc_B); // Inicia Proc_A como uma thread pthread_create(thread_C, Proc_C); // Inicia Proc_A como uma thread // faz com que a thread principal espere as demais acabarem pthread_join(thread_A); pthread_join(thread_B); pthread_join(thread_C); Fim. RESPOSTAS Identificação das linhas do sistema que podem causar problemas durante a execução: Resposta: Procedimento Proc_B libera_plotter(); libera_impressora(); libera_scanner(); Explicação dos problemas que podem ocorrer: Resposta: A liberação de processos fora da ordem de execução certa ocasiona bloqueio de um dos processos em execução, o que ocasiona impasses Proposta de correção: Resposta: Procedimento Proc_B() Início Enquanto (verdadeiro) Faça // Procedimento nunca termina processa_algo(); aloca_scanner(); processa_algo(); aloca_impressora(); processa_algo(); aloca_plotter(); processa_algo(); libera_scanner(); libera_impressora(); libera_plotter(); Fim Enquanto; Fim;
Compartilhar