2017-01-15 36 views
0

我正在寫一個程序,用於生成模擬讀寫器問題的線程數量。一些線程被分配給讀取器的任務,其中一些是寫入器線程。標記數組保持爲確保爲每個循環迭代分配不同的寫入器線程。 RW是我爲讀寫操作編寫的類。程序工作正常,直到循環的第一次迭代結束時爲止。但在並行段程序結束時掛起。openmp程序掛在塊的末尾

#include<iostream> 
#include<fstream> 
#include<omp.h> 

using namespace std; 

class RW 
{ 

string text,dsp,path; 
fstream f,r; 

public: RW(string p) 
{ 
    path=p; 
} 

public: void reader() 
{ 
    //cout<<"in reader\n"; 

    { 
     r.open(path.c_str(),ios::in); 
     r>>dsp; 
     cout<<dsp<<endl; 
     r.close(); 
    } 

} 

public: void writer() 
{ 
    f.open(path.c_str(),ios::out); 
    cout<<"Enter text to be written: "; 
    cin>>text; 
    cout<<endl; 
    f<<text; 
    //cout<<"end -- write \n"; 
    f.close(); 
} 


}; 
int main() 
{ 
    omp_lock_t lk; 
    omp_init_lock(&lk); 
    int flag[10]; 
    RW rw("a.txt"); 
    string dsp; 
    int th_no,no_th; 
    int wn,rn; 
    cout<<"Enter no of writer threads: "; 
    cin>>wn; 
    cout<<"\nEnter no of reader threads: "; 
    cin>>rn; 



for(int i=0;i<10;i++){flag[i]=0;} 
//omp_set_nested(1); 

for(int i=0;i<wn;i++) 
{ 
    cout<<i<<": loop"<<endl; 
    #pragma omp parallel default(shared) private(th_no) num_threads(wn+rn) 
    { 
     th_no = omp_get_thread_num(); 
     cout<<omp_get_thread_num()<<endl; 

     #pragma omp barrier 
     if(th_no<wn && flag[th_no]==0) 
     { 
     #pragma omp sections 
     { 

      #pragma omp section 
      { 
       cout<<"thread no: "<<omp_get_thread_num()<<endl; 
       omp_set_lock(&lk); 
       rw.writer(); 
       flag[omp_get_thread_num()]=1; 
       omp_unset_lock(&lk); 
      } 
     } 
     } 

     #pragma omp barrier 
     if(omp_get_thread_num()>=wn) 
     { 
      omp_set_lock(&lk); 
      cout<<"thread no:"<<omp_get_thread_num()<<endl; 
      rw.reader(); 
      omp_unset_lock(&lk); 
     } 
     #pragma omp barrier 
     #pragma omp flush 
     th_no=0; 
    } 


} 

return 0; 

}

+1

請不要把'public:'放在一切之前。這不是常見的做法,也不是C#或Java。 – DeiDei

+0

我是剛剛開始編碼的新手,但我會記住這一點,thanx –

回答

1

你的程序是不是一個有效的OpenMP代碼。 sections是工作共享結構,因此必須由所有線程在球隊遇到,即使沒有足夠的部分來養活所有線程(OpenMP Specification,2.7節):

每個工作共享區域必須由遇到除非最內層封閉平行區域要求取消,否則團隊中的所有線程或根本沒有。

僅在if運算符的一個分支中表示某些線程不會遇到它。在實踐中,這會導致sections構造末尾的隱含障礙。我不確定你想要達到什麼目的,但代碼必須以某種方式進行重構。

+0

謝謝...!那工作 –