2016-09-21 8 views
0

Ich benutze mehrere Threads, um verschiedene zufällige Dateien mit Threads zugreifen. Ich erhalte jedoch einen Fehler [Thread 0x7ffff7007700 (LWP 16256) exited]. Info-Threads zeigen außerdem, dass nur 2 Threads erstellt werden. Ich versuche jedoch, 100 davon zu erstellen. Muss ich in meinem Fall auch die Funktion pthread_join() verwenden? Der Code:Mehrere Dateizugriffe mit Threads

#define NTHREADS 100 
void *encrypt(void *args) 
{ 
    int count = *((int*) args); 
    AES_KEY enc_key; 
    AES_set_encrypt_key(key, 128, &enc_key); 

    int i; 

    for(i=1;i<=count;i++){ 

    char *ifile; 
    char *ofile; 
    long length; 
    size_t result; 
    char * buffer; 

    sprintf(ifile,"random_files/random_%d.txt",i); 
    FILE *ifp = fopen(ifile,"rb"); 

    if (ifp==NULL) {fputs ("File error",stderr); exit (1);} 

    fseek(ifp,0, SEEK_END); 
    length = ftell(ifp); 
    fseek (ifp,0, SEEK_SET); 

    buffer = (char*) malloc (sizeof(char)*length); 
    if (buffer == NULL) {fputs ("Memory error",stderr); exit (2);} 
    result = fread (buffer, 1, length, ifp); 
    if (result != length) {fputs ("Reading error",stderr); exit (3);} 
    printf("%s",buffer); 
    fclose (ifp); 
    free(buffer); 
    } 
} 
int main(){ 
int i,j,count =0; 
pthread_t threads[NTHREADS]; 

for (i=0; i<NTHREADS; i++){ 
    count = count +20; 
    int *count_ptr = &count; 
    if(pthread_create(&threads[i], NULL, encrypt, count_ptr)!=0){ 
      fprintf(stderr, "error: Cannot create thread # %d\n", i); 
      break; 
     } 
} 

printf("After Thread\n"); 
exit(0); 
} 
+1

1. Verbinden Sie Ihre Threads in einer Follow-up-Schleife. 2. Sie haben eine Race Condition. Das gleiche "count" zurück in main, das sich mit jeder Schleifeniteration ändert, wird von * all * Ihren Threads adressiert. Sie senden die gleiche Adresse an * alle * von ihnen. 3. * validiere Rückkehrergebnisse *. – WhozCraig

+0

@WhozCraig Danke für Ihren Kommentar. Ist es möglich, für jeden neuen Thread verschiedene vales von count an die encrypt-Funktion zu senden? –

Antwort

1

Ja, Sie sollten Ihren Threads beitreten, da keine freistehend erstellt wurden (und Sie sind wahrscheinlich nicht tief genug darin, pThreads zu lernen, um damit umzugehen).

Das heißt, Sie haben ein signifikantes logisches Problem in Ihren Thread-Parametern. Sie sind alle bekommen die Adresse der gleichencount Variable in main. Wahrscheinlich ist die schnellste Art und Weise, dass auf der Thread-proc ohne Modifikationen zu ändern ist einfach eine aufstehen Seite-an-Seite Anordnung von int counts[NTHREADS] Threads übereinstimmt, indem jedes Element als das Daten param des entsprechenden thread:

int main() 
{ 
    pthread_t threads[NTHREADS]; 
    int counts[NTHREADS]; // HERE 
    int i,j,count =0; 

    for (i=0; i<NTHREADS; i++) 
    { 
     counts[i] = (count += 20); 
     if(pthread_create(&threads[i], NULL, encrypt, counts+i)!=0) // LAST PARAM 
     { 
      fprintf(stderr, "error: Cannot create thread # %d\n", i); 
      break; 
     } 
    } 

    for (i=0; i<NTHREADS; ++i) 
     pthread_join(threads[i], NULL)); 

    return EXIT_SUCCESS; 
} 

Alternativ Sie könnten einige dynamische Zuweisungsrahmen erstellen oder den Wert über intptr_t an void* senden, aber die oben gezeigte Methode hat den Vorteil, dass Sie keine Änderungen an Ihrem Thread-Proc vornehmen müssen, ein Ziel, das ich anstrebte.

Ich habe alle Probleme in Ihrem Thread-Proc zu lösen, aber das sollte Sie zumindest auf Ihrem Thread-Stack und laufen.

1

Es fehlen Dinge im Code zunächst in Ihrer Verschlüsselungsfunktion, um die Fäden am Ende und auch in der Hauptfunktion BUT, schließen müssen, bevor Sie dies tun, nach der for-Schleife Sie müssen alle beitreten, dann werden sie korrekt verarbeitet und geschlossen.

Der Fluss wird so gehen:

(void) pthread_join(th1, NULL); 
(void) pthread_join(th2, NULL); 

Sie sie alle in ein setzen können für sie von tid beizutreten.

Ein weiteres Update: Es ist nicht wirklich etwas "zufällig" los, ich würde nur öffnen Sie die Dateien entsprechend seiner tid, und fügen Sie dann andere große Implementierungen, Ihre wie wird versuchen, Dateien wie verrückt zu öffnen, sollte es arbeite sowieso, aber sag nur.