2016-11-15 6 views
-1

Ich habe ein ProblemDoppel frei oder Korruption

Fehler in `./thread ': Doppel frei oder Korruption (out): 0x00000000021bb030

Zweck meines Programms eingegeben wird: Anzahl der Gewinde (argv [1]) und lies data.txt 100 Integer und jede Sortierung der Threads. in jetzt

ist mein ganzes Code dort ..

#include <stdio.h> 
#include <stdlib.h> 
#include <pthread.h> 

void *bubble(void *data){ 

    int * arr = data; 
    int i,j,tmp; 
    int size = (sizeof(arr)/4); 
    printf("%d",size); 

    for(i=0;i<size;i++){ 
     for(j=0;j<size-1;){ 
      if(arr[j]>arr[j+1]) 
      { 
       tmp = arr[j]; 
       arr[j]=arr[j+1]; 
       arr[j+1]=tmp; 
      } 

     } 

    } 

    for(i=0;i<size;i++) printf("%d ",arr[i]); 
     printf("\n"); 
    return ((void *)0); 
} 

int main(int argc, char **argv){ 

    FILE * fd; 
    int data[100]; 

    int i,j; 
    int tcount = atoi(argv[1]); 
    int n = 100/tcount; 
    int cursor=0; 
    int err; 


    pthread_t *thread_t = (pthread_t *)malloc(tcount* sizeof(pthread_t)); 

    int **data3 = (int **)malloc(tcount *sizeof(int*)); 
    for(i=0; i<tcount; i++) 
     data3[i] = (int *)malloc((100/tcount) *sizeof(int)); 


    fd = fopen("data.txt", "r"); 

    printf("tcount = %d n=%d\n",tcount,n); 
    for(i =0; i<100;i++) 
    { 
     fscanf(fd, "%d",&data[i]); 
     printf("%d ", data[i]); 
    } 

    for(j=0;j<tcount;j++){ 
     for(i=0;i<n;i++){ 
      data3[j][i]=data[n*j+i]; 
      printf("%d ",data3[j][i]); 
     } 
     printf("\n"); 
    } 


    for(i =tcount; i>0;i--) 
    { 
     err=pthread_create(&thread_t[i],NULL,bubble,(void *)&data3[i]); 
      if(err != 0) 
       printf("creat thread error"); 
    } 




    for(int i=0; i<tcount; i++) 
     free(data3[i]); 
    free(data3); 
    free(thread_t); 
    fclose(fd); 

} 
+0

Diese 'int size = (sizeof (FER)/4);' berechnet nicht die Größe des Arrays, auf die 1. Element 'arr' Punkte ist. Hinweis 'arr' ist ein Zeiger und kein Array. Ein minimaler Debugging-Aufwand hätte dies aufgedeckt. – alk

+0

'für (i = tcount; i> 0; i -)' beginnt bei 'tcount' –

Antwort

1

Sie die Threads erstellen, dann sofort starten Sie den Speicher durch die Fäden verwendet zu befreien, ohne zu warten, sie zu verlassen. Sie beenden dann den Prozess, bevor die Threads möglicherweise beendet wurden, und töten sie.

Sie sollten warten, bis die Threads beendet sind, bevor Sie das Programm bereinigen und beenden. Sie tun das, indem pthread_join Aufruf:

for(int i=0; i<tcount; i++) 
    pthread_join(thread_t[i]); 

Und wie in einem Kommentar sagte sizeof(arr) werden Sie nicht die Größe des Arrays geben. Es gibt Ihnen die Größe des Zeigers und nicht, worauf es hinweist.

Darüber hinaus beginnen Ihre Thread-Erstellung-Schleife durch außerhalb der Grenzen zu undefined Verhalten führen. Der höchste Index ist tcount - 1 der niedrigste Index ist 0.

Zum Schluss ein paar kleine Notizen: Zunächst geht es um die Benennung der thread_t Variablen. Das Suffix _t wird normalerweise für Typen-Aliase verwendet, wie z.B. pthread_t. Obwohl es nicht falsch ist, könnte es Leser Ihres Codes verwirren. Der zweite ist, dass ein Nullzeiger in C durch NULL dargestellt wird. Verwenden Sie nicht (void *) 0 (es ist nicht tragbar).

+0

Also danke über die Beantwortung meiner Frage. Ich möchte Größe (arr) bekommen. Wie? Und, ich habe Problem nicht mehr Ausführung nach for (j = 0; j HERIUN

+0

@HERIUN Leider können Sie nicht die Größe, die nicht als Argument übergeben bekommen. Die Lösung ist nicht auf den Zeiger auf das Array übergeben, sondern eine (dynamisch zugeordnet) Struktur sowohl den Zeiger und die Größe enthält. –

Verwandte Themen