【发布时间】:2017-04-17 14:32:48
【问题描述】:
在我的程序中有很多循环可以很容易地重写为多线程。基本上对于每个应该是多线程的函数,我都在编写以下函数:
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)
【问题讨论】:
-
只想说,除非
i_from始终为 0,否则该函数看起来并不平均分配工作。尝试使用(3, 8, 2, ...)在心理上通过它,最终得到thread(func_one_thread, 3, 4, ...)和thread(func_one_thread, 4, 8, ...)。所以,除非我错过了什么,否则可能会有点不平衡。 -
是的,在我的代码中
i_from始终为零,现在我只是尝试更一般地重写它但失败了...... -
啊。我自己对多线程不太熟悉,但也许
i_inc = (i_max - i_min) / num_th;会起作用。不过,您需要检查i_max - i_min是否可以被num_th整除,以查看是否有任何线程需要做额外的工作。 -
是的,我更正了这一点(请参阅下面的答案)。如果
i_max - i_min不能被num_thread整除,那么第一个线程正在做额外的工作 - 由 modnum_thread(%) 实现。 -
我建议您查看 OpenMP,根据您在运行时拥有的内核数量,它会为您做得很好。
标签: c++ multithreading