Ir para conteúdo
Fórum Script Brasil
  • 0

Dúvida Threads


Bruno Peinado

Pergunta

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 Main
Exemplo de arquivo de entrada
5
10
39534 34829 17884 47912
10407 7841 20165 9082 30944 1906
23644 12705 28587 11868 29305 33223 48266 22643 35322 29217 13828 1641 21061 1312 10828 24368 39834 32626 38420 45720 17455 6304 43632 46559 16711 17825 33076 42145 48769 34982 49987 22413 14039 44926 34281 9697 28149 48899 48692 29823 28116 28873 47816 15529
8644 39897 36371 41271 28317 32091 25078 34621 25723 37990 17684 9901 21066 26181 8670 22401 42520 47436 2792 37446 48069 12489 15595 46969 11182 11770 25085 6407 9587 40615 36592 18231 30512 22964 25854 25182 21407
9803 13483 38923 43840 23384 26341 20021 32054 48742 12542 45842 1535 49988 43912 30376 31936 40881 7910 43706 32318 14317 19645 39285 910 37877 36150 40226 30083 11332 11633 31016 37487 25116 36291 31327
12633 1349 46907 27727
9101 29262 46583 3013 25991 28519 10246 33901 38578 42565 14571 24575 31850 31833 28804 34352 22059 8888 45684 44 39904 33172 41513 26196 30851 6365 5181 48552 19624 32908 28795 28726 28523 41731 31739 4514 36602 41986 4767 41532 903 19338 16108 49105 1171
33458 39582 3800 45494 5979 10057 28666 47492 2605 25870 3857 7786 24422 23482
19570 18560 35569 11301 299 6435 14255 8637 11203 5788 9540 46893 21896 24998 14417 33160 8456 20351 36961 3950 26330 13370 48969 23822 15975 24839 44032 40113 15613 33866 47159 1535 2426 32729 29188 19077 39164 43444 27715 16719 49232 3607 13613 37480 28605 28030
3413 48381 40305 7364 24712 3675 22685 14886 36002 13876 8918 26115 29489 9136 23275 47377 11562 6004 26565 30640 11520 20009 8355 28240 35593 28314 41853 39425 23272 36235 26418 26685 34616 16723 401 25680 36751 23086 6919 22753 36962 32189 48869 32804
22144 30181 2888 44500 23098 33528 6020 43108 8235 612 45053 2902 42465 831 26174 28700 27249 19211 29669 10324 19613 5349 47075 9051 28620 19829 12366 10810
11522 2136
8055 5024 18046 31153 4905 40418 40613 29492 41031 2019 32394 33496 2850 24920 28549 46451 10484 8218 23127 46449 29919 20203 5500 8540 6384 34218 19350 41434 12092 37838 14980 20147 42862 49378 1301 14119 39796 8266 9964 30827 10285 8710 14324 13135 33631 9225
10467 17443 49066 6916 13714 19269 12416 22254 42005 12987 7956 49791 25079 45794 31123 11579 5009 30501 12880 35480 20297 21146 45444 1125 47784 20507 31801 10919 20490 41026 36858 30957 24821 35924 37873 4887 21545 16641
29902 29628 1450 29693 21060 13597 27168 32639 34958 7669 11871 20438 44318 49369 32235 11795 47153 2742 43596 8073 23232 974 11283 4189 42147 13559 8414 13387 35104 25055 6881 31358 21036 24683 11051 42096 38280 38219 24735 39590 12240 2958 10029 6558 2327 8616
49481 27710 44654 23906 942 11981 35189 21483
15100 29897 17515 16556 21304 40748 47914 42340 15432 25317 788 20064 29888 41875 9655 42128 44833 36036 15038 47161 44652 49744 46642 22362 44399 36900 39656 22732 38441 27491
3541 23740 10728 20097 45044 17828 34363 3737 33260 9680 4525 3325
46401 29332 31696 41234 15368 13086 4747 26372 29183 17741 15086 39934 4641 21094 12666 43082 48585 5878 12975 38677
49424 73 787 33787 3810 399 43467 8336 20076 33035
49408 31083 12323 31128 44170 33423 7500 23353 1164 22586 29639 5806 10032 42305 48888 8617 48183 28216 47294 31142 27640 47368 48281 11428 17530 48680 4895 42218 18757 37931 13307 34517 35366 41983 15646 29536 25406 23146 19241 26570 12085
48728 22117 41185 13969 47087 5721 42185 10733 3215 19825 24453 1496 31253 41984 176 2501 554 35285 6784 13862 19803 42150 22197 35449 38039 13955 24947 23632 6877 3384 22513 5606
30050 19575 38941 2123 11760 49674
47937 40480 6834 45543 48816 23363 48044 49370 8648 4828 29584 28451 13330 1781 30252 1369 15736 21552 25002 22614 24936 13867 44572 16790 43917 14147 22083 46041 42259 38110 17731 40196 28590 24566 35739 27406 47929 135 26776 22929
6361 17733 18294 24494 47985 36015 6583 19537 11017 29197 10826 24884 23769 27616 35154
49700 47547 46527 4162 15278 3075 32752 39844 5167 26510 4125 5302 19638 43407 26618 42351 11140 11264 16846 9125
23429 45015 8297 18978 5841 49533 9099 49809 34687 29719 15861 32234 42598 20023 47513 12025 19127 3709 17192 45637 24187 38847 31628 17594 31817 23979 28734 43081 40825 4211 6712
49226 31361 15936 21419 30895 41387 37581 15582
3442 14169 13704 39818 28034 25730 25297 31743

Link para o comentário
Compartilhar em outros sites

0 respostass a esta questão

Posts Recomendados

Até agora não há respostas para essa pergunta

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.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...