2016-09-13 37 views
0

我有一個簡單的程序,它使用openMP運行4個線程,可以讀取4個不同的文本文件並查找字符。我只是想弄清楚爲什麼報告的最後一個線程顯示線程數爲26478 ......我無法弄清楚。函數countAnagrams對tid沒有任何作用,只是在函數完成運行時將它打印到屏幕上。OpenMP沒有顯示正確的線程號 - C

下面是我的代碼和輸出。任何幫助將不勝感激。

#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);} 

    } 
} 
} 

輸出:

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

請勿張貼文字的照片。改爲發佈實際文字。 –

+0

線程號碼是一種id,而不是實際的號碼。從輸出看來,好像有四個線程在運行。 – deamentiaemundi

+0

我會記得下一次約翰,謝謝 – drewfiss90

回答

-1

可能導致此問題的事情是,在TID main函數聲明。試着做以下方式:``

#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

是什麼造成您的問題是,你還沒有宣佈當你創建並行區域的線程ID私有變量。因此,線程正在彼此碾壓並導致垃圾。爲了解決這個問題,確保所有變量只能由一個線程可以訪問聲明private像這樣:

#pragma omp parallel private(tid)