2016-12-02 70 views
3

在我的程序中有很多循環可以很容易地重寫成多線程。基本上應爲其multithreadd我寫下面的函數每個函數:多線程封裝器

void func_to_threaded(int i_from, int i_to, int num_th, ...other_parameters) 
{ 
    int i_min = i_from; 
    int i_max = i_to; 
    int i_inc = i_max/num_th; 
    i_max = i_max % num_th + i_inc; 
    thread* th_dens = new thread[num_th]; 
    for (int i = 0; i < num_th; i++) 
    { 
     th_dens[i] = thread(func_one_thread, i_min, i_max, ...other_parameters); 
     i_min = i_max; 
     i_max += i_inc; 
    } 
    for (int i = 0; i < num_th; i++) th_dens[i].join(); 
    delete[] th_dens; 
} 

有沒有辦法改寫這個是通用表單的各項功能

void func_one_thread(int i_min, int i_max, ...other_parameters) 
+0

只是要去說,該功能看起來並不像它拆分工作均勻,除非'i_from'始終爲0。試了精神上做的時候用'(3,8, 2,...)',並以'thread(func_one_thread,3,4,...)'和'thread(func_one_thread,4,8,...)'結束。所以,除非我錯過了一些東西,否則它可能有點不平衡。 –

+0

是的,在我的代碼中'i_from'總是爲零,現在我只是試圖更一般地重寫它,但失敗了...... – Michal

+0

啊。不太熟悉自己的多線程,但也許'i_inc =(i_max - i_min)/ num_th;'會工作。但是,您需要檢查'i_max - i_min'是否被'num_th'完全整除,以查看是否有任何線程需要做額外的工作。 –

回答

0

它`因爲我問這個問題,我一陣感動,從boost threadpool回更優雅和簡單OpenMP最初建議Mark Setchell。所以,我的代碼現在看起來很簡單

omp_set_num_threads(num_thread); 

#pragma omp parallel for private(private_params) 
for(int i = i_min; i < i_max; i++){ 
    some_func(parameters); 
} 
1

我不會回答你的問題與模板,儘管這當然是一個有效的方法。我要重新安裝insted來使用線程池,並將所有操作包裝到一個通用界面中。例如參見:12,用升壓:3

'stay high level'

+1

這看起來像是一個評論,而不是一個答案,即使我不採取「我不會回答你的問題」的字面部分。 –

1

基於Piotr Falkowski的建議我用threadpoolboost庫來編寫此類

// header file 
#include "threadpool.hpp" 
class c_Pool 
{ 
public: 
    // CONSTRUCTORS 
    c_Pool(int num_thread); 

    // VARIABLES 
    int num_thread; 
    boost::threadpool::pool th_pool; 

    // METHODS 
    void add_task(int i_from, int i_to, std::function<void(int, int)> func); 
}; 

// main file 
c_Pool::c_Pool(int num_thread): 
    num_thread(num_thread), th_pool(num_thread) 
{} 

void c_Pool::add_task(int i_from, int i_to, function<void(int, int)> func) 
{ 
    int i_min = i_from; 
    int i_max = i_to; 
    int i_inc = (i_max - i_min)/num_thread; 
    i_max = i_from + i_inc // initial i_max 
      + (i_max - i_min) % num_thread; // first thread is doing extra work 

    for (int i = 0; i < num_thread; i++) 
    { 
     auto func_one_thread = bind(func, i_min, i_max);   
     th_pool.schedule(func_one_thread); 
     i_min = i_max; 
     i_max += i_inc; 
    } 
    th_pool.wait(); 
} 

和每一個功能void some_func(int i_min, int i_max, ...other_parameters)我正在用多線程處理

auto tmp_func = bind(some_func, placeholders::_1, placeholders::_2, ...other_parameters); 
pool.add_task(i_from, i_to, tmp_func); 

編輯糾正線問心無愧設置已經有一段初始i_max

+0

我不知道,但不應該'add_task()'的第4行是'i_max = i_min +((i_max - i_min)%num_thread + i_inc);'?目前有可能'i_max'與該行之後的'i_min'相同或者小於'i_min'。 (例如,如果'i_from'是'8','i_to'是'16',並且'num_thread'是'2',那麼......'i_min'設置爲'8','i_max'設置爲(16(8-8)/ 2)→8/2→4),將i_max設爲4((( 16-8)%2 + 4→8%2 + 4→0 + 4→4)。除此之外,儘管數學看起來不錯,據我所知。 –

+0

是的,你是對的。在我的程序中,我使用'i_from = 0',所以我從來沒有遇到過這個錯誤... – Michal

+0

如果某些東西看起來有點懷疑,嘗試通過異常輸入來運行它可能會很有用,以查看它是否正常工作。 –