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 ?
Exemplo 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.