多线程包装器

时间:2016-12-02 16:01:55

标签: c++ multithreading

在我的程序中有很多循环可以很容易地重写成多线程。基本上对于应该是多线程的每个函数,我正在编写以下函数:

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)

3 个答案:

答案 0 :(得分:1)

我不会用模板回答你的问题,尽管它肯定是一种有效的方法。我要修复insted以使用线程池,并将所有操作包装到一个公共接口。参见例如:12,加强:3

&#39; stay high level&#39;

答案 1 :(得分:1)

根据Piotr Falkowski的建议,我使用threadpool <body class="bg"> </body>库来编写此类

SqlCommand cmd = new SqlCommand(
    "update seller set  fname = @firstName", con);

// 2. define parameters used in command object
SqlParameter param = new SqlParameter();
param.ParameterName = "@firstName";
param.Value = nam;

// 3. add new parameter to command object
cmd.Parameters.Add(param);

并且每个函数boost我使用

进行多线程处理
// 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();
}

编辑已更正的行wth设置为初始void some_func(int i_min, int i_max, ...other_parameters)

答案 2 :(得分: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);
}