2016-09-13 3 views
0

Ich habe ein einfaches Programm, das OpenMP verwendet, um 4 Threads auszuführen, die in 4 verschiedenen Textdateien lesen und Anagramme finden. Ich versuche nur herauszufinden, warum der letzte Thread, der gemeldet wird, eine Thread-Nummer von 26478 zeigt ... ich kann es nicht genau herausfinden. Die Funktion countAnAngrams tut nichts mit tid, sondern druckt sie nur auf den Bildschirm, wenn die Funktion beendet ist.OpenMP nicht korrekte Thread-Nummer anzeigen - C

Unten ist mein Code und der Ausgang. Jede Hilfe würde sehr geschätzt werden.

#include <omp.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

void countAnagrams(char* fileName, int threadNum); 

void main() 
{ 
    char *fileNames[] = {"AnagramA.txt","AnagramB.txt","AnagramC.txt","AnagramD.txt"}; 
    int i; 
    int tid; 
    int nthreads = 4; 
    omp_set_num_threads(nthreads); 

#pragma omp parallel 
{ 
    #pragma omp sections 
    { 

     #pragma omp section 
      {tid = omp_get_thread_num(); 
      countAnagrams(fileNames[0], tid);} 
     #pragma omp section 
      {tid = omp_get_thread_num(); 
      countAnagrams(fileNames[1], tid);} 
     #pragma omp section 
      {tid = omp_get_thread_num(); 
      countAnagrams(fileNames[2], tid);} 
     #pragma omp section 
      {tid = omp_get_thread_num(); 
      countAnagrams(fileNames[3], tid);} 

    } 
} 
} 

Ausgang:

Filename: AnagramD.txt 
Hello from thread: 1 
Number of anagrams: 286 
Longest anagram: 8 

Filename: AnagramB.txt 
Hello from thread: 0 
Number of anagrams: 1148 
Longest anagram: 8 

Filename: AnagramC.txt 
Hello from thread: 2 
Number of anagrams: 5002 
Longest anagram: 8 

Filename: AnagramA.txt 
Hello from thread: 26478 
Number of anagrams: 3184 
Longest anagram: 8 
+4

Sie nicht Bilder von Text schreiben. Veröffentlichen Sie stattdessen den eigentlichen Text. –

+0

Die Thread-Nummer ist eine Art ID, nicht die tatsächliche Nummer. Und von der Ausgabe scheint es, als ob vier Threads laufen würden. – deamentiaemundi

+0

Ich werde mich daran erinnern, dass für das nächste Mal John, danke – drewfiss90

Antwort

-1

Die Sache, die dieses Problem verursachen kann, ist, dass tid in Hauptfunktion erklärt. Versuchen Sie es in der folgenden Art und Weise zu tun: ``

#include <omp.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

void countAnagrams(char* fileName, int threadNum); 

void main() 
{ 
char *fileNames[] = {"AnagramA.txt","AnagramB.txt","AnagramC.txt","AnagramD.txt"}; 
int i; 

int nthreads = 4; 
omp_set_num_threads(nthreads); 

#pragma omp parallel private(tid) //now each thread has its private copy of tid 
{ 
    #pragma omp sections 
    { 

    #pragma omp section 
     {tid = omp_get_thread_num(); 
     countAnagrams(fileNames[0], tid);} 
    #pragma omp section 
     {tid = omp_get_thread_num(); 
     countAnagrams(fileNames[1], tid);} 
    #pragma omp section 
     {tid = omp_get_thread_num(); 
     countAnagrams(fileNames[2], tid);} 
    #pragma omp section 
     {tid = omp_get_thread_num(); 
     countAnagrams(fileNames[3], tid);} 

    } 
    } 
} 
1

Was Ihr Problem verursacht ist, dass Sie nicht Ihr Thread-ID-Variable privaten deklariert haben, wenn Sie Ihren parallelen Bereich erstellen. So stampfen Fäden dort übereinander und Müll kann entstehen. Um dies zu beheben, stellen Sie sicher, dass alle Variablen, die nur von einem einzigen Thread zugänglich sein sollten private wie so erklärt werden:

#pragma omp parallel private(tid)