2012-02-03 144 views
2

我想使用OpenMP進行線程,因爲它是跨平臺的。然而,我不能解決如何在循環運行時並行繼續之後創建代碼?它基本上只是並行執行第一個循環,但從來沒有進入第二個非並行循環?OpenMP運行線程,但繼續主線

int main() { 
    #pragma omp parallel 
     while(1) { 
      Sleep(4000); 
      printf("doing work in thread %d, nthreads %d\n", omp_get_thread_num(), omp_get_num_threads()); 
     } 


    while (1) { 
     Sleep(4000); 
     printf("Hello from main %d, nthreads %d\n", omp_get_thread_num(), omp_get_num_threads()); 
    } 
} 
+0

你不能有工作線程「OMP並行」區域結束後運行(在你的榜樣並行區域是第一「,而( ){...}'在並行區域的末尾有一個不可見的障礙(就在第二次之前) – osgx 2012-02-03 17:37:52

+0

實際上,OpenMP本身對於你想要的是不好的選擇,它不是「另一個線程庫」,它是一個不同的解決方案有自己的規則可以遵循,更好的解決方案是啓動一個單獨的線程(可以使用OpenMP),讓主線程進入「非並行」循環。如果你更詳細地描述用例,那麼這很好。 – 2012-02-03 20:41:35

+0

@AlexeyKukanov,我同意,但OpenMP具有問題中描述的好處。 – 2012-02-03 23:09:41

回答

2

我想你可以只讓一個線程的OMP內的特殊的線程並行塊

int main() { 
    #pragma omp parallel 
     if(omp_get_thread_num()==0){ 
      while(1) { 
       Sleep(4000); 
       printf("Hello from main %d, nthreads %d\n", omp_get_thread_num(), omp_get_num_threads()); 
      } 
     }else{ 
      while(1) { 
       Sleep(4000); 
       printf("doing work in thread %d, nthreads %d\n", omp_get_thread_num(), omp_get_num_threads()); 
      } 
     } 
    } 
} 

天氣這是有道理的,你的情況是很難沒有更多的細節來判斷。您可以使用sections。從這裏舉例:http://bisqwit.iki.fi/story/howto/openmp/#Sections

#pragma omp parallel // starts a new team 
{ 
    //Work0(); // this function would be run by all threads. 

    #pragma omp sections // divides the team into sections 
    { 
    // everything herein is run only once. 
    { Work1(); } 
    #pragma omp section 
    { Work2(); 
     Work3(); } 
    #pragma omp section 
    { Work4(); } 
    } 

    //Work5(); // this function would be run by all threads. 
} 

你可以做嵌套的重新國有化:OpenMP: What is the benefit of nesting parallelizations?

+0

感謝Johan,我想實現的是運行一個會永久循環的線程,但主代碼的其餘部分應該繼續。所以我只想要主線程和另一個線程是平行的,他們會做不同的事情。這在其他線程庫中是不正常的。該程序運行(線程0),然後它產生一個線程做東西,代碼繼續。 – Mark 2012-02-03 16:52:06

+0

我意識到這一點。嘗試使用部分。 – 2012-02-03 16:53:43

+0

非常感謝! – Mark 2012-02-03 19:01:40