-
Notifications
You must be signed in to change notification settings - Fork 2
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Leitura de args + n max threads #41
Conversation
o -n está tratado. Testei com 1 e valores para cima, nunca falha (quebra o programa) Tive de mudar muito o programa cliente, principalmente a parte de open() do fifo privado e read() do fifo privado. Da forma como está agora caso não tenha resposta no fifo privado após 5 tentativas quer dizer que não tem nenhuma thread a tratar do seu pedido e então dá FAILD |
O erro que está a dar agora é que há threads com threadid's diferentes mas i's iguais a printar FAILD. A forma de acesso à variável i deve estar quebrada em algum lado, vou tentar tratar disso |
Resolvi o número das threads, não podiamos estar a usar o i para printar o numero de cada thread porque é uma variável global, ou seja o i no inicio de uma thread pode ser diferente do i a meio dessa mesma thread porque entretanto outra thread pode tê-lo incrementado |
} | ||
else | ||
{ | ||
// o que é suposto fazer aqui? |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
aqui acho que não precisamos deste else, ele simplesmente fica a correr este ciclo while para se manter aberto até acabar o tempo
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Concordo, quando o if se tornar false fazer cleanup, por isso basta mudar para um while
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ok estava a pensar e talvez tenha mesmo que ser um if na mesma, porque pode acontecer haver o máximo de threads ativas ao mesmo tempo (pouco provável acho, mas pode acontecer)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Para chegar a esse else quer dizer que há um pedido mas não existem threads para o atender. Na thread do cliente este vai conseguir excrever no fifo público, fazer o fifo privado e abrir o fifo privado (porque tem NONBLOCK) . Quando tentar ler do fifo é que irá dar erro devido a esta parte :
// Attempts to read from private fifo until there's a response
int try = 0;
while(tmpresult<=0 && try < 5){
if (try != 0)
usleep(100*1000);
tmpresult = read(fd_priv,&receivedMessage,BUFSIZE);
try++;
}
if(tmpresult<=0) {
printRegister(time(NULL), threadn, getpid(), pthread_self(), useTime, -1, FAILD);
if(close(fd_priv)==-1){perror("Client-closePrivateFifo");}
if (unlink(privateFifo)==-1){perror("Error destroying private fifo:");}
pthread_exit(0);
}
Que acho que é a estratégia que faz sentido. Tendo em conta que é uma casa de banho, se for feito um pedido e não houver ninguém para "atender" o cliente tem de tentar mais x vezes e voltar mais tarde.
E.G. Se a casa de banho de S.Bento não tivesse torniquete, só a senhora a verificar as senhas. Se chegar lá um gajo que quer mandar o Obama à casa branca e não tiver lá a senhora ele fica um tempo à espera e depois vai embora, para retornar mais tarde ou ir a outro sitio.
Outra estratégia seria guardar o pedido numa fila para assim que houver o thread disponivel tratar desse pedido, mas a fila já está meio implícita nas tentativas que a thread client faz.
cada pedido é atendido por um thread, que comunica com o thread cliente e controla o tempo de utilização de um lugar do Quarto de Banho; se não houver lugares disponíveis, espera que haja e prossegue;
Este se não houver lugares diponiveis é dentro de cada thread que se vai verificar, não engloba este problema.
as mensagens trocadas são sempre aos pares:
○ cada pedido terá sempre uma resposta
Vi isto no enunciado e acho que estamos meio lixados. Da forma que está agora como está a fazer a verificação no read por tentativas não está garantido que terá sempre uma resposta. Da forma que está agora serve para caso haja algum erro (de escrita ou leitura dos fifos) que não cause o término do programa de forma inesperada, mas não assegura esta condição :/
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Isso quer dizer que o nthreads é o nthreads em simultâneo? E o cliente tem de esperar que hajam threads disponiveis para o atender? Damn
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
nthreads – nº (máximo) de threads a atender pedidos
Yep, em simultâneo não pode haver mais do que nthreads ativas
Quanto ao cliente é que não tenho a certeza. Acho que o objetivo é ter o servidor a tratar de mais trabalho em vez de pôr o cliente a pensar quando pode fazer pedidos ou não.
Acho que o cliente apenas faz pedidos e não se interessa se existem threads para o atender ou não, se houver -> fixe, pedido atendido, se não houver -> FAILD . Acho que não há problema com a parte do "se não houver" porque estão a ser feitos "pedidos" e não "clientes" novos
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pois faz sentido, os pedidos podem ser da mesma pessoa, o cliente nao tem de saber quando fazer o pedido, simplesmente faz e pronto depois vê se consegue ser atendido ou não, acho q ta bem assim
places to 0 at start
Primeiro dar merge a este PR antes de ver este