Repository files navigation
d: tamanho da pista, definido na entrada;
k: quantidade de ciclistas, definido na entrada;
modo: se é ingenuo(i) ou eficiente(e);
debug: se vai entrar no modo debug ou não;
MAX_TICKS: controla os testes, tem que excluir depois!!!!!
tick_global: contador central de tempo de simulação;
pista: matriz de inteiros pra mostrar a posição dos ciclistas;
ciclistas: vetor da struct Ciclista;
ultimo_ciclista_id: ID do ultimo a cruzar a linha de chegada a cada 2 rodadas pra ser eliminado;
variáveis de sincronização e controle:
ciclistas_ativos: conta quantos ciclistas ainda estão correndo, serve pra barreira;
tick_chegadas: conta quantos chegaram e estão esperando o proximo tick;
rodada_voltas: controla a rodada atual para eliminação a cada 2 voltas;
controle_pista: matriz dos mutexes de cada posição da matriz pista, usado no modo e (eficiente);
barreira_mutex: protege o acesso pra alterar o valor de ciclistas_ativos;
print_mutex: protege as chamadas printf pra não ficar no meio do texto;
tick_mutex: protege a variavel tick_chegadas na sincronização dos ticks;
tick_cond: coordena o avanço dos ticks
mutex_ultimo: pra proteger a eliminação do último colocado a cada 2 voltas;
cria a matriz pista com N_FAIXAS (10) linahs e d colunas;
inicializa todas as posições com -1;
inicializa os mutexes pra proteger o acesso à pista;
se o modo for i, é um mutex só
se o modo for e, são vários mutexes, um pra cada posição da pista;
aloca o vetor ciclistas;
define os parametros iniciais de cada ciclista;
sorteia a posição inicial do ciclista;
verifica_ultimo(ciclista c)
chamada quando o ciclista termina uma volta;
verifica se todos os ciclistas ativos já terminaram a volta;
se sim, imprime qual foi o último a completar;
verifica_frente(ciclista c)
consulta a posição na frente do ciclista (d+1)
retorna o ID do ciclista que tá na frente ou -1 se não tiver ninguém;
usa o mutex pra proteger a leitura conforme o modo (i ou e);
atualiza_velocidade(ciclista c)
atualiza a velocidade de acordo com as probabilidades diferentes;
atualiza 'ticks_para_mover'
chama aguarda_tick() pra indicar que chegou ao fim do tick e aguarda o coordenador liberar pro próximo;
chama libera_tick() para liberar todos os ciclistas e avança o tick_global;
verifica_volta_completada(Ciclista *c, int col_antiga, int col_nova)
detecta quando o ciclista completou uma volta (se saiu de d-1 para 0);
atualiza o número de voltas completadas;
chama 'verifica_ultimo()' e 'atualiza_ultimo()';
verifica_quebra(ciclista c)
a probabilidade de quebrar a cada 5 voltas;
decrementa ciclistas_ativos se algum quebrar;
verifica_eliminacao(ciclista c)
a cada rodada, contabiliza ciclistas que terminaram a volta;
elimina o ultimo a completar a volta;
atualiza 'ciclistas_ativos'
tenta_mover_para_frente(ciclista c)
protege com mutexes;
atualiza a posicao do ciclista na struct;
Função executada por cada thread de ciclista.
Loop até MAX_TICKS ou até que ciclista quebre ou seja eliminado.
A cada tick:
Decrementa ticks_para_mover ou tenta se mover.
Chama verificações de eliminação/quebra.
Aguarda liberação do próximo tick (aguarda_tick()).
Atualiza ciclistas_ativos ao terminar.
Marca terminou para permitir o join.
Imprime finalização protegida por mutex.
About
No description, website, or topics provided.
Resources
Stars
Watchers
Forks
You can’t perform that action at this time.