2016-12-02 39 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

如果某些东西看起来有点怀疑,尝试通过异常输入来运行它可能会很有用,以查看它是否正常工作。 –