Será que tem que mandar a thread dar exit ou ela termina sua execução e finaliza ela ?
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h> /* sleep() */
//quantidade máxima de produtos
#define MAX_PROD 1000
#define limit_threads 100
int Flag;
int Sincronia;
int PedePraGrava;
int PodeLer;
struct coisa
{
int t; //Numero da thread
int pares; //combinações de mais vendidos
int linha; //linha
int compra[limit_threads][MAX_PROD];
int vendidos[limit_threads][1][50];//maximo 50 mais vendidos
//0 - codigo
//1 - quantidade vendida
};
void *Compara(void *threadid)
{
struct coisa *args = threadid;
int aux,w, i,sujeito,maiores, temp, repetido;
aux = args->t;//save point
printf("Thread #%d!\n",aux);
Flag = 1;
i = 0;
while ( args->compra[aux][i] != 0 )
{
printf("Comparando thread %d\n", aux);
w = 0;
maiores = 1;
sujeito = args->compra[aux][i];
while ( args->compra[aux][w] != 0 )
{
if (sujeito == args->compra[aux][i])
{
args->compra[aux][i] = -1;//pra não contar mesmo produto
maiores ++;
}
w++;
}
printf("Terminou de compara 1 unico produto deste client\n");
// maiores tem o numero de repetições desse produto
// sujeito é o codigo do produto
//Mesmo produto do top sendo vendido, então incrementa
w = 0;
repetido = 0;
while (w < args->pares){
if (args->vendidos[aux][0][w] == sujeito){
args->vendidos[aux][1][w] = args->vendidos[aux][1][w] + maiores;
repetido = 1;
}
}
printf("Novo produto passa a ser mais vendido\n");
w = 0;
temp = 0;
if (repetido == 0)
{
while (w < args->pares)
{
if(args->vendidos[aux][1][w] < maiores){
if (temp == 0)
temp = w;
else{
if (args->vendidos[aux][1][temp] < args->vendidos[aux][1][w])
temp = w;
else
temp = temp;
}
}
}
printf("//Terminou de comparar com os mais vendidos\n");
}
if (temp != 0){
args->vendidos[aux][1][temp] = maiores;
args->vendidos[aux][0][temp] = sujeito;
}
printf("//Terminou de inserir novo Top vendido\n");
i++;
}//Terminou de comparar todos os produtos
printf("//Ajusta sincronia\n");
i = 0;
while ( i == 0 )
{
if (Sincronia == aux){
Sincronia = Sincronia + 1;
i = 1;
printf("Thread %d Fora de sincronia", aux);
}
}
}
void *Reseta(void *threadid)
{
struct coisa *args = threadid;
int i = 0;
int aux;
aux = args->t;
Flag = 1;
while( i < MAX_PROD )
{
args->compra[aux][i] = 0;
i++;
}
i = 0;
while ( i == 0 )
{
if (Sincronia == aux){
Sincronia = Sincronia + 1;
i = 1;
//printf("Thread %d Fora de sincronia", aux);
}
}
printf("Processado thread #%d! \n", aux);
}
int main (int argc, char *argv[])
{
struct coisa arg1;
int NUM_THREADS, dado,i;
FILE *fin= fopen(argv[1], "r");
char comando;
if (argc!=2){
printf("Falta parametro, execute assim: ./programa entrada.txt saida.txt\n");
}
if (!fin){
printf("\nErro com arquivo de entrada.\n");
exit(1);
}
fscanf(fin,"%d",&arg1.pares);//N - pares de compra
fscanf(fin,"%d",&arg1.linha);//K - linhas
NUM_THREADS = arg1.linha;
printf("Top %d Produtos vendidos\n", arg1.pares);
printf("Rodadas de %d linhas\n", arg1.linha);
if (arg1.linha > limit_threads ){
printf("Não funciona com Rodadas de %d linhas\n", arg1.linha);
printf("Tente aumentar o 'limit_threads' mas, depende da memoria\n");
exit(0);
}
pthread_t threads[arg1.linha];
while (!feof(fin))
{
arg1.t = 0;
Flag = 1;
Sincronia = 0;
//Reseta a lista de compra
while ( arg1.t < arg1.linha )
{
Flag = 0;
pthread_create(&threads[arg1.t], NULL, Reseta, (void *)&arg1);
while(Flag != 1)
{
}
arg1.t = arg1.t + 1;
}
while (Sincronia != arg1.linha){
printf("'2'");
}
arg1.t = 0;
i = 0;
Flag = 0;
printf("Escreve a Lista de compra\n");
while ( arg1.t < arg1.linha )
{
while(comando != '\n')
{
fscanf(fin, "%d",&dado);
arg1.compra[arg1.t][i] = dado;
i++;
fscanf(fin, "%c", &comando);
}
arg1.t = arg1.t +1;
}
arg1.t = 0;
Sincronia = 0;
printf("Analisa a lista de compra e passa para lista de vendidos\n");
while ( arg1.t < arg1.linha )
{
Flag = 0;
pthread_create(&threads[arg1.t], NULL, Compara, (void *)&arg1);
while(Flag == 1){
}
arg1.t = arg1.t + 1;
}
while (Sincronia != arg1.linha){
printf("aguardando thread #%d\n", Sincronia);
sleep(1);
}
}//Fim do arquivo
pthread_exit(NULL);
}//Fim do Main
Pergunta
Bruno Peinado
Tenho o seguinte código:
Ele lê bilhões de linhas de um arquivo txt.
Faz comparações e le outras linhas.
Se alguém quiser executar:
gcc -o thread -lpthread thread.c
./thread
Então, o problema é que as thread estão travando.
Porque será que elas travam ?
Será que tem que mandar a thread dar exit ou ela termina sua execução e finaliza ela ?
#include <pthread.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> /* sleep() */ //quantidade máxima de produtos #define MAX_PROD 1000 #define limit_threads 100 int Flag; int Sincronia; int PedePraGrava; int PodeLer; struct coisa { int t; //Numero da thread int pares; //combinações de mais vendidos int linha; //linha int compra[limit_threads][MAX_PROD]; int vendidos[limit_threads][1][50];//maximo 50 mais vendidos //0 - codigo //1 - quantidade vendida }; void *Compara(void *threadid) { struct coisa *args = threadid; int aux,w, i,sujeito,maiores, temp, repetido; aux = args->t;//save point printf("Thread #%d!\n",aux); Flag = 1; i = 0; while ( args->compra[aux][i] != 0 ) { printf("Comparando thread %d\n", aux); w = 0; maiores = 1; sujeito = args->compra[aux][i]; while ( args->compra[aux][w] != 0 ) { if (sujeito == args->compra[aux][i]) { args->compra[aux][i] = -1;//pra não contar mesmo produto maiores ++; } w++; } printf("Terminou de compara 1 unico produto deste client\n"); // maiores tem o numero de repetições desse produto // sujeito é o codigo do produto //Mesmo produto do top sendo vendido, então incrementa w = 0; repetido = 0; while (w < args->pares){ if (args->vendidos[aux][0][w] == sujeito){ args->vendidos[aux][1][w] = args->vendidos[aux][1][w] + maiores; repetido = 1; } } printf("Novo produto passa a ser mais vendido\n"); w = 0; temp = 0; if (repetido == 0) { while (w < args->pares) { if(args->vendidos[aux][1][w] < maiores){ if (temp == 0) temp = w; else{ if (args->vendidos[aux][1][temp] < args->vendidos[aux][1][w]) temp = w; else temp = temp; } } } printf("//Terminou de comparar com os mais vendidos\n"); } if (temp != 0){ args->vendidos[aux][1][temp] = maiores; args->vendidos[aux][0][temp] = sujeito; } printf("//Terminou de inserir novo Top vendido\n"); i++; }//Terminou de comparar todos os produtos printf("//Ajusta sincronia\n"); i = 0; while ( i == 0 ) { if (Sincronia == aux){ Sincronia = Sincronia + 1; i = 1; printf("Thread %d Fora de sincronia", aux); } } } void *Reseta(void *threadid) { struct coisa *args = threadid; int i = 0; int aux; aux = args->t; Flag = 1; while( i < MAX_PROD ) { args->compra[aux][i] = 0; i++; } i = 0; while ( i == 0 ) { if (Sincronia == aux){ Sincronia = Sincronia + 1; i = 1; //printf("Thread %d Fora de sincronia", aux); } } printf("Processado thread #%d! \n", aux); } int main (int argc, char *argv[]) { struct coisa arg1; int NUM_THREADS, dado,i; FILE *fin= fopen(argv[1], "r"); char comando; if (argc!=2){ printf("Falta parametro, execute assim: ./programa entrada.txt saida.txt\n"); } if (!fin){ printf("\nErro com arquivo de entrada.\n"); exit(1); } fscanf(fin,"%d",&arg1.pares);//N - pares de compra fscanf(fin,"%d",&arg1.linha);//K - linhas NUM_THREADS = arg1.linha; printf("Top %d Produtos vendidos\n", arg1.pares); printf("Rodadas de %d linhas\n", arg1.linha); if (arg1.linha > limit_threads ){ printf("Não funciona com Rodadas de %d linhas\n", arg1.linha); printf("Tente aumentar o 'limit_threads' mas, depende da memoria\n"); exit(0); } pthread_t threads[arg1.linha]; while (!feof(fin)) { arg1.t = 0; Flag = 1; Sincronia = 0; //Reseta a lista de compra while ( arg1.t < arg1.linha ) { Flag = 0; pthread_create(&threads[arg1.t], NULL, Reseta, (void *)&arg1); while(Flag != 1) { } arg1.t = arg1.t + 1; } while (Sincronia != arg1.linha){ printf("'2'"); } arg1.t = 0; i = 0; Flag = 0; printf("Escreve a Lista de compra\n"); while ( arg1.t < arg1.linha ) { while(comando != '\n') { fscanf(fin, "%d",&dado); arg1.compra[arg1.t][i] = dado; i++; fscanf(fin, "%c", &comando); } arg1.t = arg1.t +1; } arg1.t = 0; Sincronia = 0; printf("Analisa a lista de compra e passa para lista de vendidos\n"); while ( arg1.t < arg1.linha ) { Flag = 0; pthread_create(&threads[arg1.t], NULL, Compara, (void *)&arg1); while(Flag == 1){ } arg1.t = arg1.t + 1; } while (Sincronia != arg1.linha){ printf("aguardando thread #%d\n", Sincronia); sleep(1); } }//Fim do arquivo pthread_exit(NULL); }//Fim do MainExemplo de arquivo de entradaLink para o comentário
Compartilhar em outros sites
0 respostass a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.