在我的程序中有很多循环可以很容易地重写成多线程。基本上对于应该是多线程的每个函数,我正在编写以下函数:
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 :(得分:1)
我不会用模板回答你的问题,尽管它肯定是一种有效的方法。我要修复insted以使用线程池,并将所有操作包装到一个公共接口。参见例如:1,2,加强: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);
}